跳轉到內容

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

注意:如果您意外打開了現有檔案,其所有內容都將被覆蓋!

華夏公益教科書