語法書 / AA 競程語法書 下冊 / 第十四單元 / 讀到檔案結尾為止

14.6 讀到檔案結尾為止

本機測試的測資檔,最常見的形態是「不知道有幾筆資料,全部讀完為止」。這件事你其實早就會了——上冊 4.8 的 EOF 輸入模式 while (cin >> x)fin 完全一樣,因為它跟 cin 是同一家人。

順帶一提,EOF 的全名是 End of File——「檔案結尾」。上冊 4.8 拿它稱呼鍵盤輸入的結束,還得用 Ctrl+D/Ctrl+Z「假裝」檔案結束;現在讀的是真正的檔案,這個名字終於名符其實:讀到檔案實際的結尾,fin >> x 失敗、迴圈自然停止。

範例程式碼

假設 data.txt 的內容如下(幾個數字、分幾行都隨意):

13 5 8
21 34
2

讀到結尾、算總和:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream fin("data.txt");
    long long sum = 0;
    int x;
    while (fin >> x) {          // 跟 while (cin >> x) 同一件事:讀到結尾停
        sum += x;
    }
    cout << sum << '\n';
    return 0;
}

執行結果:

83

>> 只認空白和換行當分隔——跟 cin 的規則一樣——所以檔案裡的數字一行擠幾個、分成幾行,程式都不用改。之後測資想加就往檔案尾端塞,程式重跑一次就好。

逐行讀入

有些檔案要一行一行處理(一行是一筆完整的資料)。10.10getline 迴圈同樣把 cin 換成 fin 就好。假設 poem.txt 的內容是:

I love AACPSCHOOL
so much

把每一行加上行號印出:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    ifstream fin("poem.txt");
    string line;
    int cnt = 0;
    while (getline(fin, line)) {        // 一次讀一整行,讀到結尾停
        cnt++;
        cout << cnt << ": " << line << '\n';
    }
    return 0;
}

執行結果:

1: I love AACPSCHOOL
2: so much

動手試試看:把範例的檔名換成你自己的程式原始碼(例如 sum.cpp)再跑一次——程式會印出自己的程式碼還附行號。原始碼也是純文字檔,讀檔程式當然讀得動它。