歡迎來到輸入/輸出與檔案處理的世界!

哈囉,未來的電腦科學家!這一章非常重要,因為它教導你的程式如何與外界溝通,以及如何在電源關閉後依然記得資料!你可以把這一章想像成賦予你的程式聲音(輸出)和耳朵(輸入),以及長期的記憶(檔案處理)。

如果剛開始覺得有點複雜,請不用擔心;我們會透過簡單的例子來拆解每一個概念。讓我們開始吧!

什麼是輸入與輸出 (I/O)?

在電腦科學中,**I/O** 代表 **Input/Output(輸入/輸出)**。這是電腦與人類或其他設備進行溝通的過程。

1. 輸入 (Input):接收數據

輸入是指發送到電腦系統以供處理的任何數據。

  • 常見設備:鍵盤、滑鼠、掃描器、感應器。
  • 程式編寫中:當我們撰寫程式碼時,常會使用如 INPUTGETREAD 等指令來要求使用者輸入數據。
  • 範例:程式詢問:「請輸入你的年齡。」使用者輸入「16」。那個「16」就是輸入。
2. 輸出 (Output):顯示數據

輸出是指經過處理後,從電腦系統發送出來的結果或資訊。

  • 常見設備:螢幕顯示器、印表機、揚聲器。
  • 程式編寫中:我們使用 PRINTDISPLAYWRITE 等指令將資訊呈現給使用者。
  • 範例:程式計算使用者明年的年齡並顯示:「你明年就 17 歲了。」這條訊息就是輸出。

快速回顧: I/O 就是溝通。輸入是進來(鍵盤),輸出是出去(螢幕)。


檔案處理:賦予程式長期記憶

當程式執行時,它會將所有數據(變數、列表)儲存在電腦的臨時記憶體中,稱為 **RAM**(隨機存取記憶體)。問題在於:當程式結束或電腦關機時,RAM 就會忘記所有東西!

這就是**檔案處理 (File Handling)** 的用武之地。檔案處理允許程式將數據永久儲存在輔助儲存裝置(如硬碟或 SSD)上。這稱為**持久性 (Persistence)**。

持久性的比喻(黑板 vs. 筆記本)

想像你在寫重要筆記:

  • RAM:就像在黑板上寫筆記。速度快、容易更改,但如果你把它擦掉或下課鐘響了(程式結束),資料就永遠消失了。
  • 檔案:就像寫在耐用的**筆記本**裡。雖然比黑板稍微慢一點,但資訊會留在上面,隨時可以等到明天再打開來看。這種儲存並稍後取回數據的能力就是**持久性**。

檔案的生命週期:開啟、處理、關閉

在程式與檔案進行互動(讀取或寫入數據)之前,必須遵循三個關鍵步驟:

  1. 開啟檔案 (Open):告知作業系統 (OS) 你想要哪一個檔案,以及你打算對它做什麼(讀取、寫入或追加)。
  2. 處理檔案 (Process):執行必要的動作(逐行讀取數據或寫入新數據)。
  3. 關閉檔案 (Close):釋放檔案,讓作業系統可以再次管理它。此步驟至關重要,以防止資料損壞或遺失。

常見錯誤:務必記得 **CLOSE** 檔案!如果你沒關閉,你寫入的資料可能無法正確儲存,或者其他程式可能無法在稍後存取該檔案。

檔案模式:開啟檔案的三種方式

當你開啟檔案時,必須指定其**模式 (Mode)**。這會明確告知程式和作業系統你需要哪些權限。

我們將專注於三種主要的順序檔案模式:讀取 (Read)、寫入 (Write) 和追加 (Append)。

1. 讀取模式 (Read - R)
  • 目的:從現有的檔案中獲取資訊。
  • 動作:程式只能瀏覽數據;不能更改或增加任何內容。
  • 風險:如果檔案不存在,程式通常會導致錯誤(「找不到檔案」錯誤)。
2. 寫入模式 (Write - W)
  • 目的:將新數據儲存到檔案中。
  • 動作:如果檔案已存在,它會被**完全刪除(覆寫)**,並建立一個新的空檔案供寫入。如果檔案不存在,則會建立一個新檔案。
  • 比喻:這就像循環利用舊筆記本——你撕掉所有頁面,從乾淨的封面開始寫!要小心,你會立刻失去所有舊數據。
3. 追加模式 (Append - A)
  • 目的:將新數據增加到現有檔案的「末尾」。
  • 動作:程式會找到檔案的最後一行,並直接在後面寫入新數據。現有的內容會被保留。如果檔案不存在,則會建立一個新檔案。
  • 比喻:這就像打開你的筆記本,在昨天的筆記之後直接加上今天的內容。

記憶技巧 (RAW): R (Read/讀取), A (Append/追加), W (Write/寫入)。永遠記住每一種模式對現有數據造成的影響!

順序檔案存取 (Sequential File Access)

課程重點在於**順序檔案存取**。這是管理檔案數據最簡單的方式。

什麼是順序存取?

在順序檔案中,數據是一個接一個地儲存的(就像列表)。要存取中間或最後的數據,程式必須按順序讀取它之前的所有數據

順序存取的比喻(錄音帶)

想像你的數據儲存在舊式的**錄音帶**上(不是 MP3 檔!)。

  • 如果你想聽第 3 首歌,你不能直接點擊它。
  • 你必須快轉略過第 1 首和第 2 首歌,順序地處理它們,直到到達第 3 首。

這正是順序檔案運作的方式。程式讀取第一筆記錄,然後第二筆、第三筆,以此類推。

順序模式下的讀取步驟:
  1. 程式以讀取模式開啟檔案。
  2. 程式讀取第一行/記錄。
  3. 檔案指標(就像你手指在頁面上的位置)移動到下一行的開頭。
  4. 程式讀取下一行。
  5. 此動作重複進行,直到程式觸及**檔案結尾 (EOF)** 標記為止。

關鍵點:順序存取是有序的。你必須執行步驟 1,然後是步驟 2,以此類推。


檢測檔案結尾 (EOF)

程式如何知道它已經讀完檔案中的所有數據了呢?它會尋找**檔案結尾標記**。

**EOF** (End of File) 是作業系統放置在檔案末尾的特殊訊號或標記。

為什麼 EOF 很重要

當程式使用迴圈(例如 WHILE 迴圈)逐行讀取檔案時,需要一個停止條件。如果它嘗試讀取超過最後一筆數據,程式可能會崩潰或讀取到雜亂的數據。

程式迴圈通常會持續執行 **WHILE NOT EOF**。當偵測到 EOF 標記時,迴圈停止,程式就知道它已經成功讀取所有數據了。

使用 EOF 的程式邏輯:

(虛擬碼範例)
OPEN "Data.txt" FOR READ
WHILE NOT EOF ("Data.txt") DO
READLINE DataFromFile
PRINT DataFromFile
ENDWHILE
CLOSE "Data.txt"

處理錯誤(檔案處理出錯時)

優秀的程式設計師總會預見問題。在處理檔案時,事情可能會出錯——通常與作業系統或硬體有關。

你必須加入程式碼來優雅地處理常見錯誤,防止整個程式崩潰。這稱為**錯誤處理 (Error Handling)**。

最常見的檔案錯誤:找不到檔案

發生情況:

  • 使用者嘗試以讀取模式 (R) 開啟檔案,但檔案已被刪除或名稱拼錯。
  • 程式正在錯誤的目錄/資料夾中搜尋。

如果找不到檔案,程式應停止當前操作,透過有意義的訊息告知使用者(例如:"錯誤:找不到資料檔案 'Sales.txt'。"),並允許程式的其餘部分安全地繼續執行,而不是直接凍結。


最終總結與鼓勵

你已經掌握了程式如何進行溝通的基礎知識!請記住以下關鍵概念:

  • I/O:程式溝通的方式(輸入=獲取,輸出=顯示)。
  • 持久性:使用檔案(長期記憶)而非 RAM(短期記憶)。
  • 檔案模式:R(讀取)、W(寫入/覆寫!)、A(追加)。
  • 順序存取:嚴格按順序讀取數據。
  • EOF:告訴程式何時停止讀取的關鍵標記。

繼續練習那些「開啟、處理、關閉」的步驟。理解檔案處理是成為強大程式設計師的重要一大步。做得好!