在C++中,文件操作是通過流(stream)來實現的。標準庫提供了三種主要的文件流類來處理文件IO操作:
ofstream
:用于寫入文件(output file stream)ifstream
:用于讀取文件(input file stream)fstream
:用于讀寫文件(file stream)
這些類都繼承自C++標準庫中的流基類,提供了統一的接口來操作文件。
一、文件流類的基本使用
打開文件
打開文件是進行文件操作的第一步。每個流類都提供了open()
方法,也可以在構造函數中直接指定文件名:
#include <fstream>// 使用構造函數打開文件
std::ofstream outFile("example.txt"); // 寫入模式
std::ifstream inFile("example.txt"); // 讀取模式
std::fstream ioFile("example.txt", std::ios::in | std::ios::out); // 讀寫模式// 或者使用open()方法
std::ofstream outFile2;
outFile2.open("example.txt");
文件打開模式
文件打開模式可以通過位操作符|
組合使用:
std::ios::in
:讀取模式std::ios::out
:寫入模式(默認會截斷文件)std::ios::app
:追加模式std::ios::ate
:打開后定位到文件末尾std::ios::trunc
:打開時截斷文件(刪除原有內容)std::ios::binary
:二進制模式
檢查文件是否成功打開
在進行文件操作前,應該檢查文件是否成功打開:
if (!outFile.is_open()) {std::cerr << "無法打開文件!" << std::endl;return 1;
}// 或者更簡潔的方式
if (!outFile) {std::cerr << "文件打開失敗!" << std::endl;return 1;
}
二、寫入文件(ofstream)
ofstream
類用于向文件寫入數據,它繼承了ostream
的功能,因此可以使用<<
操作符:
#include <fstream>
#include <iostream>int main() {// 創建并打開文件std::ofstream outFile("data.txt");if (outFile.is_open()) {// 寫入文本數據outFile << "Hello, World!" << std::endl;outFile << "這是一個測試文件。" << std::endl;// 寫入數值數據int number = 42;double pi = 3.14159;outFile << "Number: " << number << ", Pi: " << pi << std::endl;// 寫入自定義數據std::string name = "Doubao";outFile << "Name: " << name << std::endl;// 關閉文件outFile.close();std::cout << "文件寫入成功!" << std::endl;} else {std::cerr << "無法打開文件進行寫入!" << std::endl;}return 0;
}
三、讀取文件(ifstream)
ifstream
類用于從文件讀取數據,它繼承了istream
的功能,因此可以使用>>
操作符或getline()
方法:
#include <fstream>
#include <iostream>
#include <string>int main() {// 打開文件std::ifstream inFile("data.txt");if (inFile.is_open()) {// 逐行讀取std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}// 關閉文件inFile.close();} else {std::cerr << "無法打開文件進行讀取!" << std::endl;}return 0;
}
讀取不同類型的數據
#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream inFile("data.txt");if (inFile.is_open()) {// 讀取字符串std::string text;inFile >> text;std::cout << "讀取的文本: " << text << std::endl;// 讀取整數int number;inFile >> number;std::cout << "讀取的整數: " << number << std::endl;// 讀取浮點數double pi;inFile >> pi;std::cout << "讀取的浮點數: " << pi << std::endl;// 讀取整行(包括空格)std::string fullLine;std::getline(inFile, fullLine); // 清除緩沖區中的換行符std::getline(inFile, fullLine);std::cout << "讀取的整行: " << fullLine << std::endl;inFile.close();}return 0;
}
四、讀寫文件(fstream)
fstream
類結合了ifstream
和ofstream
的功能,可以同時進行讀寫操作:
#include <fstream>
#include <iostream>
#include <string>int main() {// 打開文件進行讀寫,不截斷std::fstream ioFile("data.txt", std::ios::in | std::ios::out);if (ioFile.is_open()) {// 讀取現有內容std::string content;std::getline(ioFile, content);std::cout << "讀取的內容: " << content << std::endl;// 定位到文件末尾進行追加ioFile.seekp(0, std::ios::end);ioFile << "這是追加的內容" << std::endl;// 定位到文件開頭重新讀取ioFile.seekg(0, std::ios::beg);while (std::getline(ioFile, content)) {std::cout << content << std::endl;}ioFile.close();}return 0;
}
五、文件定位和狀態檢查
文件定位
可以使用以下方法控制文件指針位置:
tellg()
:返回輸入位置tellp()
:返回輸出位置seekg()
:設置輸入位置seekp()
:設置輸出位置
狀態檢查
流狀態可以通過以下方法檢查:
good()
:檢查流是否正常eof()
:檢查是否到達文件末尾fail()
:檢查是否發生非致命錯誤bad()
:檢查是否發生致命錯誤clear()
:清除錯誤標志
六、二進制文件操作
對于二進制文件,需要使用std::ios::binary
模式:
#include <fstream>
#include <iostream>int main() {// 寫入二進制數據{std::ofstream outFile("binary.bin", std::ios::binary);int numbers[] = {1, 2, 3, 4, 5};outFile.write(reinterpret_cast<char*>(numbers), sizeof(numbers));}// 讀取二進制數據{std::ifstream inFile("binary.bin", std::ios::binary);int readNumbers[5];inFile.read(reinterpret_cast<char*>(readNumbers), sizeof(readNumbers));for (int i = 0; i < 5; ++i) {std::cout << readNumbers[i] << " ";}std::cout << std::endl;}return 0;
}
七、文件操作的最佳實踐
- 始終檢查文件是否成功打開
- 使用RAII原則(資源獲取即初始化)管理文件資源
- 明確指定文件打開模式
- 對于大文件,考慮分塊讀取或寫入
- 處理可能的異常情況
- 使用
std::endl
會刷新緩沖區,如需提高性能可使用\n
- 對于二進制文件,使用
read()
和write()
方法
通過掌握這些文件IO操作,可以在C++中有效地處理各種文件讀寫任務。