在 C++ 中,读取和写入文件主要通过 <fstream>
头文件提供的类来实现。以下是详细的方法和示例:
1. 包含必要的头文件
cpp
#include <fstream> // 文件流操作
#include <string> // 使用字符串
#include <iostream> // 输入输出
2. 写入文件
使用 ofstream (输出文件流)
cpp
#include <fstream>
#include <iostream>
int main() {
// 创建输出文件流对象
std::ofstream outFile;
// 打开文件(如果文件不存在会自动创建)
outFile.open("example.txt");
// 检查文件是否成功打开
if (!outFile.is_open()) {
std::cout << "无法打开文件!" << std::endl;
return 1;
}
// 写入数据
outFile << "Hello, World!" << std::endl;
outFile << "这是第二行" << std::endl;
outFile << 123 << " " << 45.67 << std::endl;
// 关闭文件
outFile.close();
std::cout << "数据写入成功!" << std::endl;
return 0;
}
简化的写入方式
cpp
#include <fstream>
int main() {
// 使用构造函数直接打开文件
std::ofstream outFile("example.txt");
if (outFile) { // 检查文件是否成功打开
outFile << "简化方式写入数据" << std::endl;
outFile << "自动会在析构时关闭文件" << std::endl;
}
return 0;
}
3. 读取文件
使用 ifstream (输入文件流)
cpp
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 创建输入文件流对象
std::ifstream inFile;
inFile.open("example.txt");
if (!inFile.is_open()) {
std::cout << "无法打开文件!" << std::endl;
return 1;
}
std::string line;
// 逐行读取文件内容
while (std::getline(inFile, line)) {
std::cout << line << std::endl;
}
inFile.close();
return 0;
}
其他读取方式
cpp
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream inFile("example.txt");
if (inFile) {
// 方式1:逐词读取
std::string word;
while (inFile >> word) {
std::cout << "单词: " << word << std::endl;
}
// 清空文件状态并重新定位到开头
inFile.clear();
inFile.seekg(0);
// 方式2:读取单个字符
char ch;
while (inFile.get(ch)) {
std::cout << ch;
}
}
return 0;
}
4. 同时读写文件
使用 fstream
cpp
#include <fstream>
#include <iostream>
int main() {
// 打开文件用于读写
std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::app);
if (file.is_open()) {
// 写入数据
file << "新数据" << std::endl;
// 移动到文件开头
file.seekg(0);
// 读取数据
std::string content;
while (std::getline(file, content)) {
std::cout << content << std::endl;
}
file.close();
}
return 0;
}
5. 二进制文件操作
cpp
#include <fstream>
#include <iostream>
struct Data {
int id;
double value;
char name[20];
};
int main() {
// 写入二进制数据
Data data = {1, 3.14, "Test"};
std::ofstream outFile("binary.dat", std::ios::binary);
if (outFile) {
outFile.write(reinterpret_cast<char*>(&data), sizeof(Data));
outFile.close();
}
// 读取二进制数据
Data readData;
std::ifstream inFile("binary.dat", std::ios::binary);
if (inFile) {
inFile.read(reinterpret_cast<char*>(&readData), sizeof(Data));
std::cout << "ID: " << readData.id
<< ", Value: " << readData.value
<< ", Name: " << readData.name << std::endl;
inFile.close();
}
return 0;
}
6. 文件打开模式
模式标志 | 描述 |
---|---|
std::ios::in |
打开用于读取 |
std::ios::out |
打开用于写入 |
std::ios::app |
追加模式(在文件末尾写入) |
std::ios::ate |
打开后定位到文件末尾 |
std::ios::trunc |
如果文件存在,先截断 |
std::ios::binary |
二进制模式 |
重要提示
- 总是检查文件是否成功打开
- 记得关闭文件(虽然析构函数会自动关闭,但显式关闭是好习惯)
- 处理可能的异常(文件不存在、权限问题等)
- 使用合适的打开模式
- 二进制文件操作时要注意数据对齐和字节顺序
这些是 C++ 中文件操作的基本方法,根据具体需求选择合适的方式。