一、C++文件操作核心类
C++标准库通过<fstream>
提供了强大的文件操作支持,主要包含三个关键类:
类名 | 描述 | 典型用途 |
---|---|---|
ofstream | 输出文件流(Output File Stream) | 文件写入操作 |
ifstream | 输入文件流(Input File Stream) | 文件读取操作 |
fstream | 双向文件流(兼具读写功能) | 需要同时读写的场景 |
二、常用API函数详解
1. 文件打开与关闭
// 构造时直接打开文件
ifstream fin("data.txt", ios::in);
ofstream fout("output.txt", ios::out);
// 使用open方法
fstream file;
file.open("data.bin", ios::binary | ios::in);
// 检查是否打开成功
if (!fin.is_open()) {
cerr << "文件打开失败!" << endl;
}
// 关闭文件
file.close();
文件打开模式:
模式标志 | 描述 |
---|---|
ios::in | 读模式(默认ifstream) |
ios::out | 写模式(默认ofstream),会清空原内容 |
ios::app | 追加模式(写入内容到文件末尾) |
ios::ate | 打开后定位到文件末尾 |
ios::binary | 二进制模式(默认是文本模式) |
ios::trunc | 截断文件(如果文件已存在) |
2. 文本文件读写
写入示例:
ofstream fout("log.txt");
if (fout) {
fout << "当前时间: " << time(nullptr) << endl;
fout << "状态: 正常运行" << endl;
fout.close();
}
读取示例:
ifstream fin("data.txt");
string line;
while (getline(fin, line)) { // 逐行读取
cout << line << endl;
}
3. 二进制文件操作
写入二进制数据:
struct Person {
char name[20];
int age;
double height;
};
Person p = {"张三", 25, 175.5};
ofstream fout("person.dat", ios::binary);
fout.write(reinterpret_cast<char*>(&p), sizeof(Person));
读取二进制数据:
Person p;
ifstream fin("person.dat", ios::binary);
if (fin.read(reinterpret_cast<char*>(&p), sizeof(Person))) {
cout << "姓名: " << p.name << endl
<< "年龄: " << p.age << endl
<< "身高: " << p.height << endl;
}
三、文件位置控制
// 获取当前读位置
streampos pos = fin.tellg();
// 设置读位置(从文件开头偏移100字节)
fin.seekg(100, ios::beg);
// 设置写位置(从当前位置回退50字节)
fout.seekp(-50, ios::cur);
四、最佳实践建议
-
RAII原则:利用构造函数自动打开,析构函数自动关闭
{ // 代码块开始 ofstream tempFile("temp.txt"); // 使用文件... } // 离开作用域自动关闭
-
异常处理:启用文件流异常
file.exceptions(ios::failbit | ios::badbit); try { file.open("data.txt"); } catch (const ios::failure& e) { cerr << "文件操作异常: " << e.what(); }
-
状态检查:操作前验证流状态
while (fin >> data) { // 自动检测流状态 // 处理数据 }
五、完整示例代码
#include <iostream>
#include <fstream>
#include <vector>
int main() {
// 写入测试数据
{
ofstream fout("numbers.txt");
for (int i = 1; i <= 100; ++i) {
fout << i * i << endl;
}
} // 自动关闭文件
// 读取并计算平均值
ifstream fin("numbers.txt");
double sum = 0;
int count = 0;
double num;
while (fin >> num) {
sum += num;
count++;
}
cout << "平均值: " << sum / count << endl;
return 0;
}
六、常见问题解答
Q:为什么我的文件内容没有保存?
A:确保文件正确关闭(显式调用close()或离开作用域)
Q:如何处理大文件(超过内存容量)?
A:采用分块读写的方式,避免一次性加载整个文件
Q:文本模式和二进制模式有什么区别?
A:在Windows系统中,文本模式会自动转换换行符(\r\n
↔ \n
)