C++ 標準程式庫提供 <fstream> 標頭檔,封裝了功能強大的檔案輸入輸出類別。相較於 C 標準庫的 FILE* 操作,C++ 流式操作更具型別安全、擴充性強且程式碼可讀性高。本文將系統性說明 ASCII 與二進制檔案的讀寫技巧,並介紹常用的流操作函數。
ofstream:輸出檔案流(寫入)ifstream:輸入檔案流(讀取)fstream:雙向檔案流(同時讀寫)現代 C++ 標準使用 <fstream>(無 .h 後綴),已包含 <iostream> 功能。
// 方式 1:建構函數直接開啟
ofstream fout("output.txt");
// 方式 2:先建構再呼叫 open()
ofstream fout;
fout.open("output.txt");
若檔案不存在會自動建立;若存在預設會截斷覆寫(可用旗標控制)。
操作語法與 cout 完全一致,使用 << 插入運算子:
int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "\n";
fout << "Now here is a string: " << name << "\n";
fout << flush; // 強制寫入緩衝區,檔案保持開啟
fout.close(); // 關閉檔案,自動 flush 並釋放資源
ifstream fin("input.txt");
>> 擷取運算子以空白字元(空格、換行、Tab)為分隔:
int number;
float real;
char letter, word[8];
fin >> number >> word >> real >> letter;
getline()當需保留空白字元時使用:
char sentence[101];
fin.getline(sentence, 100); // 最多讀 100 字元或遇換行
參數:目標陣列、最大字元數(含結束符)。
ofstream fout("file.dat", ios::binary);
ifstream fin("file.dat", ios::binary);
write() / read()二進制模式不可使用 << / >>,必須使用:
fout.write((char*)&object, sizeof(object));
fin.read((char*)&object, sizeof(object));
char* 的位址struct OBJECT {
int number;
char letter;
} obj;
obj.number = 15;
obj.letter = 'M';
fout.write((char*)&obj, sizeof(obj)); // 整個結構體一次寫入
// 讀取
ifstream fin("file.dat", ios::binary);
fin.read((char*)&obj, sizeof(obj));
優勢:無需逐欄位處理,效率高且程式碼簡潔。
good():一切正常bad():發生嚴重錯誤fail():操作失敗(較 bad() 輕微)eof():到達檔案結尾get():讀取單一字元peek():窺視下一字元但不移動指標ignore(n, delim):跳過 n 字元或遇 delim 停止putback(c):將字元放回流中put(c):寫入單一字元| 旗標 | 說明 |
|---|---|
ios::app | 附加模式,寫入位置固定在檔尾 |
ios::ate | 開啟後定位到檔尾,但可隨意移動 |
ios::trunc | 截斷現有檔案(預設) |
ios::nocreate | 檔案不存在則開啟失敗 |
ios::noreplace | 檔案已存在則開啟失敗 |
組合使用:ios::binary | ios::app
ifstream fin("file.txt");
char ch;
int counter = 0;
while (!fin.eof()) {
ch = fin.get();
if (ch == 'e') counter++;
}
fin.close();
C++ 檔案 I/O 以 fstream 族類為核心,ASCII 模式適合文字資料與人工閱讀,二進制模式適合結構化資料高效儲存。掌握 write/read、getline、狀態檢查與開啟模式旗標,即可應對絕大多數檔案操作需求。建議優先使用 C++ 流操作,享受型別安全與 RAII 自動資源管理的優勢。