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 file$ FOR INPUT AS 1
OPEN file$ FOR OUTPUT AS 2
该file$确定要使用的文件名。该FOR部分指示如何访问或操作文件 - 它可能是 APPEND、BINARY、INPUT、OUTPUT 和 RANDOM。该AS #是用于该文件句柄的标识符 - 如果需要,它可以是变量。
当您需要访问文件句柄或向文件句柄写入内容时,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
注意:如果您意外打开了现有文件,其所有内容都将被覆盖!