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.10 的 getline 也一樣通用——它的第一個參數本來就是「從哪裡讀」,平常填 cin,現在填 fin:
string line;
getline(fin, line); // 從檔案整行讀入,換行一樣被讀走丟棄
動手試試看:把 input.txt 改放三個數字,程式改成讀三個、印總和。接著故意把程式裡的檔名改錯再跑一次,確認 if (!fin) 有把失敗接住、印出訊息。