語法書 / AA 競程語法書 下冊 / 第十四單元 / 用 ifstream 從檔案讀資料

14.2 用 ifstream 從檔案讀資料

從檔案讀資料,第一步是引入檔案串流的標頭檔 <fstream>(file stream),然後宣告一個 ifstream 物件——i 是 input,「輸入檔案串流」:

#include <fstream>

ifstream fin("input.txt");   // 打開 input.txt,之後用 fin 代表這個檔案

括號裡是檔名。物件名稱可以自取,競程慣例叫 fin(file input),跟 cin 一眼對應。

先把測資檔準備好

程式要讀的檔案得先存在。用你寫程式的編輯器就能建:新增一個檔案、取名 input.txt、把測資打(或貼)進去、存檔。把它跟你的程式原始碼放在同一個資料夾——檔案到底該放哪、找不到怎麼辦,是新手的第一大坑,14.5 整節都在講它;現在先照這個建議放。線上編輯器(例如 OnlineGDB)通常也能在專案裡新增檔案,跟原始碼放在一起。

假設 input.txt 的內容是:

13 29

範例程式碼

讀出兩個數字、印出總和。注意讀檔的那一行——用法跟 cin >> 一模一樣,只是把 cin 換成 fin

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

int main() {
    ifstream fin("input.txt");
    int a, b;
    fin >> a >> b;              // 用法跟 cin >> 完全相同
    cout << a + b << '\n';      // 算好的結果照常印到螢幕
    return 0;
}

執行結果:

42

程式沒有停下來等你打字——資料直接從檔案進來了。這就是 ifstream 的最大賣點:cin 會的它都會fin >> 整數fin >> 字串、跳過空白換行的規則,全部跟 cin 相同;10.10getline 也一樣通用——它的第一個參數本來就是「從哪裡讀」,平常填 cin,現在填 fin

string line;
getline(fin, line);   // 從檔案整行讀入,換行一樣被讀走丟棄

動手試試看:把 input.txt 改放三個數字,程式改成讀三個、印總和。接著故意把程式裡的檔名改錯再跑一次,確認 if (!fin) 有把失敗接住、印出訊息。