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
注意:如果您意外打開了現有檔案,其所有內容都將被覆蓋!