跳转到内容

QBasic/文件

来自维基教科书,开放的书籍,开放的世界

在本课中,我们将学习如何创建和修改文件。在此过程中,我们将创建一个文本编辑器的一部分来处理从磁盘读取和写入文件 - 该程序在本节结束时不会完成,但将在高级文本输出中完成。

让我们从设置主过程开始

'$DYNAMIC
ON ERROR GOTO handler ' Prepares the error handler
DIM text(50) AS STRING ' Used to contain the text file.
maxlines = 50 ' Contains the current size of the buffer.

DO
  CLS 'clears the screen
  INPUT "Would you like to create a (N)ew file, (L)oad an existing one, or (E)xit the program"; choice$

  SELECT CASE UCASE$(choice$) 'UCASE$ converts strings to UPPER CASE
    CASE "N" 'New file
    CASE "L" 'Load a file
    CASE "E" 'Exit
      CLS
      END
  END SELECT
LOOP 'returns to the top of the program.

handler:
errorflag = ERR  ' Keep track of the error that occurred.
RESUME NEXT ' Proceeds with the next statement.

如您所见,我们正在使用CASE而不是IF. IF语句有时可以比 case 语句更好地工作,但目前,我们想避免意大利面条代码(其中有太多GOTO's).

到目前为止,我们并没有真正做太多,但这是一个开始。我们询问了用户他们想做什么,并且完成了 1/3 的选项。当你这样说的时候,还不错!

OPEN 语句

[编辑 | 编辑源代码]

open 语句允许从磁盘读取或写入信息。通常,open 语句遵循以下模式

OPEN file$ FOR INPUT AS 1
OPEN file$ FOR OUTPUT AS 2

file$确定要使用的文件名。该FOR部分指示如何访问或操作文件 - 它可能是 APPEND、BINARY、INPUT、OUTPUT 和 RANDOM。该AS #是用于该文件句柄的标识符 - 如果需要,它可以是变量。

注意
如果您允许用户输入磁盘上不存在的文件名,则需要使用ON ERROR来对这种情况做出反应。

输入和输出

[编辑 | 编辑源代码]

当您需要访问文件句柄或向文件句柄写入内容时,PRINT 和 INPUT 语句期望文件句柄作为第一个参数出现

 INPUT #1, a$
 PRINT #2, a$

在某些情况下,您需要检测是否要到达文件末尾 - 这是通过 EOF 函数执行的,该函数接受一个接受输入的文件句柄。

从磁盘读取文件

[编辑 | 编辑源代码]

我们现在将添加一个子例程,从磁盘读取完整文件,作为文本行,到一个名为 text() 的字符串数组中。也可以读取一个充满数值的数据文件(并将这些值输入到一个数字数组中),但这属于不同的主题。

请注意找到文件“大小”的代码,方法是逐行读取直到遇到文件末尾,以及使用“SEEK”重新“倒带”到开头。

SUB LoadFile
  SHARED filename$
  SHARED lines, maxlines
  SHARED text() AS STRING
  SHARED errorflag
    
  INPUT "Enter filename: "; filename$

  OPEN filename$ FOR INPUT AS 1
  IF errorflag <> 0 THEN
    errorflag = 0
    CLOSE
    PRINT "File not found - press return to continue."
    INPUT "", a$
    EXIT SUB
  END IF

  ' Count the number of lines.
  lines = 0
  DO WHILE NOT EOF(1)
    LINE INPUT #1, l$
    lines = lines + 1
  LOOP

  'Allocate enough space for input. 
  IF maxlines > lines THEN
    REDIM text(lines + 25) AS STRING
    maxlines = lines + 25
  END IF
  SEEK #1, 1 ' Rewind to the beginning of the file.

  ' Read the lines into the buffer
  FOR cline = 1 TO lines
    LINE INPUT #1, text(cline)
  NEXT
  CLOSE 1
  errorflag = 0

END SUB

上面的示例将文件视为 type=text。如果文件包含数字(例如,每行 N 个整数 x M 行的数据数组),则可以一次读取(输入 #)一个数字,直接输入到一个数字数组中。输入将一次读取一个数字,在每次输入后“停止”。数字可以由“任何内容”分隔(因此文本行将被跳过)。

将文件写入磁盘

[编辑 | 编辑源代码]

写入磁盘文件的函数更容易

SUB SaveFile (outfile$)
  SHARED filename$
  SHARED lines, maxlines
  SHARED text() AS STRING
  SHARED errorflag
  
  IF outfile$ = "" THEN
    LOCATE 1, 1
    INPUT "Enter filename: "; outfile$
  END IF

  OPEN outfile$ FOR OUTPUT AS 1
  IF errorflag <> 0 THEN
    errorflag = 0
    CLOSE
    PRINT "Couldn't save file - press return to continue."
    INPUT "", a$
    EXIT SUB
  END IF

  ' Write each line to the file
  FOR cline = 1 TO lines
    PRINT #1, text(cline)
  NEXT

  CLOSE 1
  errorflag = 0
  filename$ = outfile$

END SUB

为了创建一个新文件,您必须以 OUTPUT 模式打开它,然后关闭它。例如

OPEN NEWFILE FOR OUTPUT AS #1
CLOSE #1

注意:如果您意外打开了现有文件,其所有内容都将被覆盖!

华夏公益教科书