本課為「C++ 探索之旅」第一部分第 10 課,主題為文件讀寫。前序課程已涵蓋變量、流程控制、函數、數組等基礎,掌握文件 I/O 後,程序將具備持久化數據能力,邁向真實應用開發。
C++ 以流抽象輸入輸出操作:
cin/cout:標準輸入/輸出流(<iostream>)ifstream/ofstream:文件輸入/輸出流(<fstream>)文件流操作與控制台流高度一致,學習成極低。
#include <fstream>
#include <string>
std::string fileName = "C:/Cpp/Files/scores.txt";
std::ofstream outFile(fileName.c_str()); // C++11 可直接傳 string
// 或分步:ofstream outFile; outFile.open(fileName);
路徑可用絕對路徑或相對路徑。目錄必須預先存在,文件不存在會自動創建。
if (!outFile) {
std::cerr << "無法打開文件:" << fileName << std::endl;
return 1;
}
outFile << "大家好,我是被寫入文件的一句話。" << std::endl;
outFile << 3.14159 << std::endl;
int age = 25;
outFile << "我 " << age << " 歲了。" << std::endl;
<< 運算符重載支援基本類型與字串,用法與 cout 完全一致。
std::ofstream outFile(fileName, std::ios::app); // 追加而非覆蓋
std::ifstream inFile(fileName);
if (!inFile) { /* 錯誤處理 */ }
| 方式 | 函數/運算符 | 適用場景 |
|---|---|---|
| 逐行 | std::getline(inFile, line) | 文本行處理,保留空格 |
| 逐詞 | inFile >> word | 以空白分隔的 token 讀取 |
| 逐字符 | inFile.get(ch) | 含空白、換行的逐字符處理 |
std::string line;
while (std::getline(inFile, line)) { // getline 返回流引用,隱式轉 bool
std::cout << line << std::endl;
// 處理每行數據...
}
從 >> 切換到 getline 時需清除殘留換行符:
inFile >> word;
inFile.ignore(); // 忽略下一個字符(通常是換行符)
std::getline(inFile, line);
outFile.close(); // 提前關閉
// 或
std::ofstream outFile;
outFile.open(fileName); // 延遲打開
通常不需要,RAII 機制保證析構時自動關閉。
| 操作 | 輸入流 | 輸出流 |
|---|---|---|
| 獲取當前位置 | tellg() | tellp() |
| 移動位置 | seekg(offset, origin) | seekp(offset, origin) |
origin 可為 std::ios::beg(開頭)、std::ios::cur(當前)、ios::end(結尾)。
inFile.seekg(0, std::ios::end);
std::streampos size = inFile.tellg(); // 文件字節數
<fstream>、ifstream/ofstreamcin/cout 幾乎相同getline 處理文本行,>> 處理格式化數據close 多為特殊需求第 11 課:小練習 —— 猜單詞遊戲,綜合運用數組、文件、隨機數等知識,開發完整小程序。