💾 編程主題 8.3:檔案處理——將你的作品永久保存!
歡迎來到檔案處理章節! 到目前為止,當你的程式執行時,你輸入的任何數據(如分數、姓名或計算結果)通常都儲存在 RAM(隨機存取記憶體)的變數中。
問題在於:一旦程式結束,這些數據就會永遠消失!這對於高分榜、通訊錄或用戶帳戶系統等應用程式來說,顯然是不夠用的。
檔案處理 (File handling) 是一個關鍵程序,讓你的程式能將數據永久保存到輔助儲存裝置(如硬碟或 SSD)中。這意味著數據可以持久保存,並在下次執行程式時再次使用。
1. 檔案處理的目的 (8.3.1)
使用檔案的基本理念是實現持久性 (Persistence)。持久性意味著即使在程式停止執行且電腦關閉後,數據仍然會被保存。
比喻:電腦的檔案櫃
將你的程式想像成辦公室裡的臨時工。變數就像便利貼——易於使用,但辦公室下班時它們就會消失。
然而,檔案就像存放在安全地點的檔案櫃。為了儲存或檢索重要資訊,程式必須遵循特定的程序:
- 取得鑰匙(OPEN 打開檔案)。
- 放入資訊或取出資訊(WRITE 寫入或 READ 讀取檔案)。
- 鎖上櫃子(CLOSE 關閉檔案)。
重點總結:檔案為程式使用的數據提供了永久儲存空間,使資訊能夠跨越多次應用程式執行而保留下來。
2. 三個基本檔案操作 (8.3.2)
為了安全且成功地與檔案互動,程式必須按順序執行以下三個步驟:
- 打開檔案 (OPEN): 此操作會在程式與儲存裝置上的實體檔案之間建立連線。它還會告訴電腦你打算使用什麼模式(讀取或寫入)。
- 處理數據 (PROCESS): 這涉及重複從檔案讀取 (READ) 數據到變數中,或將數據從變數寫入 (WRITE) 到檔案中。
- 關閉檔案 (CLOSE): 這非常重要!關閉檔案可以完成連線,確保所有保存的數據正確寫入磁碟,並釋放檔案,以便其他程式可以使用它。
🚫 常見錯誤:忘記使用 CLOSEFILE 可能會導致數據損毀,或者因為數據未完全從暫存緩衝區寫入永久儲存裝置而導致數據丟失。
3. 檔案模式:讀取 (READ) vs. 寫入 (WRITE)
當你 OPEN 一個檔案時,必須指定你想做什麼。根據教學大綱的要求,你不能用單一指令同時進行讀取和寫入。
模式 1:FOR READ(讀取)
目的:當你想從檔案中檢索或載入現有數據到程式中時使用。
動作:程式從檔案開頭開始,逐項或逐行讀取數據。
如果起初覺得有點複雜,別擔心! 只要記住,當你進行 READ 時,你就是一個「提取者」——你正在把資訊拉出來。
模式 2:FOR WRITE(寫入)
目的:當你想將程式變數中的新數據保存或儲存到檔案中時使用。
動作:這是一個「強勢」模式!
- 如果檔案已經存在,其內容會被完全刪除(覆蓋)。
- 程式會建立一個新的空檔案,並開始將數據寫入其中。
🚨 記憶小撇步:WRITE 代表 WIPE(抹除舊數據)。
4. 偽代碼 (Pseudocode) 指令 (8.3.2)
我們在偽代碼中使用特定指令來進行這些操作:
1. OPENFILE 指令
此指令開始檔案程序並設定模式。
語法: OPENFILE <File Identifier> FOR <File mode>
範例 1(讀取):
OPENFILE "HighScores.txt" FOR READ
範例 2(寫入/覆蓋):
OPENFILE "LogData.txt" FOR WRITE
2. READFILE 指令
此指令將數據從檔案移動到變數中。檔案必須以 FOR READ 打開。
語法: READFILE <File Identifier>, <Variable>
範例:
READFILE "Names.txt", UserName
// Names.txt 中下一個可用的數據項會被放入變數 UserName 中。
3. WRITEFILE 指令
此指令將數據從變數移動到檔案中。檔案必須以 FOR WRITE 打開。
語法: WRITEFILE <File Identifier>, <Variable>
範例:
WRITEFILE "LogData.txt", ErrorMessage
// 變數 ErrorMessage 的內容會被寫入 LogData.txt 檔案。
4. CLOSEFILE 指令
此指令釋放檔案並永久保存更改。
語法: CLOSEFILE <File Identifier>
範例:
CLOSEFILE "HighScores.txt"
5. 讀取與寫入數據項 (8.3.2 指引)
教學大綱要求你處理兩種類型的數據單位:
A. 讀取/寫入單一數據項
當你儲存個別資訊(如數字或特定名稱)時,你會多次使用 READFILE 或 WRITEFILE。如果你在讀取數據項,你必須了解它們的順序。
寫入兩個整數的範例:
DECLARE Score1 : INTEGER
DECLARE Score2 : INTEGER
Score1 ← 88
Score2 ← 91
OPENFILE "Scores.dat" FOR WRITE
WRITEFILE "Scores.dat", Score1
WRITEFILE "Scores.dat", Score2
CLOSEFILE "Scores.dat"
B. 讀取/寫入文字行
「文字行」通常是一條完整的記錄(一個長 STRING),其中可能包含以逗號分隔的多個數據欄位(如 CSV 檔案)。
當你讀取文字行時,整個字串(直到下一個換行字元)會一次過被提取出來。
讀取文字行的範例:
DECLARE StudentRecord : STRING
OPENFILE "StudentInfo.csv" FOR READ
READFILE "StudentInfo.csv", StudentRecord
// 如果檔案內容是 "John Doe, 15, Class A",那麼整個字串都會存入 StudentRecord。
CLOSEFILE "StudentInfo.csv"
💡 關鍵提示:遍歷檔案 (Iterating through Files)
由於檔案通常包含許多行或項目,你幾乎總是會使用疊代 (Iteration)(如 WHILE 或 REPEAT UNTIL 等迴圈)來順序讀取所有數據。例如,你可以結合預置迴圈 (WHILE) 和函式庫函式(如 EOF - 檔案結束)來持續讀取,直到到達檔案末尾,確保你能捕獲每一條記錄。
快速複習:檔案處理要點
- Purpose(目的):Persistence(持久性,永久保存數據)。
- Operations(操作):Open(打開)、Process(處理,讀取/寫入)、Close(關閉)。
- Read Mode(讀取模式):將數據拉出。
- Write Mode(寫入模式):將數據推入,並 Wipe(抹除)現有內容。