一、文件讀寫
作用:
文件讀寫指的是將數據從程序存儲到文件,或從文件讀取數據,以實現數據的持久化存儲。
C++ 提供了 fstream
頭文件,用于文件操作,主要包括:
ofstream
(輸出文件流)—— 向文件寫入數據ifstream
(輸入文件流)—— 從文件讀取數據fstream
(文件流)—— 同時支持讀寫
應用場景:
- 配置文件(保存程序設置)
- 日志系統(記錄程序運行狀態)
- 數據存儲(存儲用戶數據、序列化對象)
二、C++ 文件操作庫
頭文件:#include <fstream>
(1)主要類:
類 | 作用 |
---|---|
ofstream | 寫文件 |
ifstream | 讀文件 |
fstream | 讀寫文件 |
(2)文件打開模式(open()
的 mode
參數)
模式 | 作用 |
---|---|
ios::in | 以只讀方式打開文件(文件必須存在) |
ios::out | 以寫入方式打開文件(文件不存在會創建,存在則清空) |
ios::app | 以追加方式打開文件(數據追加到文件末尾) |
ios::binary | 以二進制模式打開文件 |
ios::ate | 打開文件并移動到文件末尾 |
ios::trunc | 清空文件內容(默認行為) |
(3)文件讀寫方法
操作 | 類 | 方法 |
---|---|---|
寫入文件 | ofstream | << 、write() |
讀取文件 | ifstream | >> 、getline() 、read() |
讀寫文件 | fstream | << 、>> 、seekg() |
文本文件 | ifstream/ofstream | 逐行讀寫 |
二進制文件 | ifstream/ofstream + ios::binary | write() 、read() |
注意:
- 文本文件:
getline()
逐行讀取; - 二進制文件:
read()/write()
提高性能; fstream
用于同時讀寫,避免頻繁打開關閉文件。
(4)文件狀態檢查函數
文件狀態檢查函數,返回值是一個布爾值。
函數名 | 作用 |
---|---|
good() | 文件流是否處于正常狀態,沒有遇到任何錯誤或異常 |
fail() | 是否發生格式錯誤或輸入/輸出操作失敗(但不包括 badbit) |
eof() | 是否讀取操作到達文件末尾 |
bad() | 是否發生了嚴重錯誤,如磁盤損壞、系統錯誤等 |
三、寫入文件(ofstream
)
示例1——向文件寫入數據
#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt"); // 創建并打開文件if (!outFile){cout << "文件打開失敗!" << endl;return -1;}outFile << "Hello, C++ 文件操作!" << endl;outFile << "寫入第二行數據" << endl;outFile.close(); // 關閉文件cout << "數據已寫入 test.txt" << endl;system("pause");return 0;
}
注意:
ofstream outFile("test.txt")
:創建/打開test.txt
,默認清空文件。outFile << "內容"
:向文件寫入數據。outFile.close()
:關閉文件,釋放資源。
示例2——追加模式寫入文件
#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt", ios::app); // 追加模式outFile << "追加數據 1" << endl;outFile << "追加數據 2" << endl;outFile.close();system("pause");return 0;
}
注意:
ios::app
追加模式,不會清空文件,而是在末尾追加數據。
四、 讀取文件(ifstream
)
示例1——逐行讀取文件
#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {ifstream inFile("test.txt"); // 打開文件if (!inFile){cout << "文件打開失敗!" << endl;return -1;}string line;while (getline(inFile, line)) // 逐行讀取{cout << line << endl;}inFile.close(); // 關閉文件system("pause");return 0;
}
注意:
getline(inFile, line)
逐行讀取文件內容,存入line
變量。
示例2——逐個字符讀取文件
#include <iostream>
using namespace std;
#include <fstream>int main() {ifstream inFile("test.txt"); // 打開文件if (!inFile){cout << "文件打開失敗!" << endl;return -1;}char ch;while (inFile.get(ch)) // 逐個字符讀取{cout << ch;}inFile.close(); // 關閉文件system("pause");return 0;
}
注意:
- 適用于逐個字符解析文件,如讀取二進制文件或處理格式化文本。
五、讀寫文件(fstream
)
示例——同時讀寫文件
#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {fstream file("data.txt", ios::in | ios::out | ios::app); // 讀寫+追加if (!file){cout << "文件打開失敗!" << endl;return -1;}file << "新數據寫入" << endl;file.seekg(0); // 移動到文件開頭string line;while (getline(file, line)){cout << line << endl;}file.close(); // 關閉文件system("pause");return 0;
}
注意:
fstream
同時支持讀寫,ios::in | ios::out
使得文件可讀可寫。seekg(0)
將讀指針移到文件開頭,確保讀取最新內容。
六、特殊用法
(1)處理二進制文件
示例1——寫入二進制文件
#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main() {ofstream outFile("person.dat", ios::binary); // 創建并打開二進制文件Person p1 = { "Alice", 25};outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1)); // 寫入二進制數據outFile.close(); // 關閉文件system("pause");return 0;
}
注意:
ios::binary
以二進制模式打開文件。write(reinterpret_cast<char*>(&p1), sizeof(p1))
將結構體寫入文件。
示例2——讀取二進制文件
#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main() {ifstream inFile("person.dat", ios::binary); // 打開二進制文件Person p;inFile.read(reinterpret_cast<char*>(&p), sizeof(p)); // 讀取二進制數據cout << "姓名: " << p.name << ", 年齡: " << p.age << endl;inFile.close(); // 關閉文件system("pause");return 0;
}
注意:
- 適用于存儲復雜數據結構(如
struct
)。 - 文件大小更小,讀取速度更快。
(2) 檢查文件流的狀態
作用:
good()
是 C++ 中std::ifstream
、std::ofstream
和 std::fstream
等文件流類提供的成員函數之一。它可以檢查文件流的狀態,判斷是否處于“良好”狀態,即文件流沒有遇到任何錯誤或異常情況。
示例:
#include <iostream>
using namespace std;
#include <fstream>int main()
{ifstream file("test.txt");if (file.good()){cout << "文件可以正常讀取!" << std::endl;}else{cout << "文件不可讀!可能不存在或發生了錯誤!" << std::endl;}file.close(); // 關閉文件system("pause");return 0;
}
(3) 獲取文件大小
作用:
tellg()
是 C++ 中std::ifstream
(輸入文件流)的成員函數,用于獲取當前文件讀取位置的指針(文件指針),即讀取操作即將在文件中的哪個字節位置執行。tellg()
常與seekg()
結合使用,以計算文件大小。
示例:
#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main()
{ofstream outFile("person.dat", ios::binary); // 創建并打開二進制文件Person p1 = { "Alice", 25 };outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1)); // 寫入二進制數據outFile.close(); // 關閉文件ifstream file("person.dat", ios::binary); // 打開二進制文件file.seekg(0, ios::end); // 將指針移動到文件末尾streampos fileSize = file.tellg(); // 獲取當前位置,即文件大小cout << "文件大小: " << fileSize << " 字節" << std::endl;file.close();system("pause");return 0;
}