悠悠楠杉
C++文件I/O基础:从零掌握文本文件操作
一、为什么需要文件I/O?
在软件开发中,数据持久化是基本需求。当我们关闭程序后,内存中的数据会消失,而文件系统提供了长期存储的解决方案。C++通过<fstream>
库提供了完整的文件操作支持,包括:
- 创建/删除文件
- 读写文本/二进制数据
- 文件指针定位
- 错误状态检测
二、文件操作基础类
C++标准库提供了三个核心类:
ofstream
:输出文件流(写操作)ifstream
:输入文件流(读操作)fstream
:双向文件流(读写操作)
cpp
include // 必须包含的头文件
using namespace std;
三、打开文件的正确姿势
3.1 基本打开方式
cpp
// 方式1:构造函数直接打开
ifstream infile("data.txt");
// 方式2:先创建后打开
ofstream outfile;
outfile.open("output.txt");
3.2 文件打开模式
通过位掩码组合控制文件行为:
| 模式标志 | 说明 |
|------------|-----------------------------|
| ios::in | 只读打开(默认ifstream) |
| ios::out | 只写打开(默认ofstream) |
| ios::app | 追加模式(不覆盖原有内容) |
| ios::trunc | 清空文件(默认ofstream行为) |
| ios::binary| 二进制模式 |
cpp
// 组合使用多个模式
fstream iofile;
iofile.open("data.txt", ios::in | ios::out | ios::app);
四、文件状态检查
操作文件前必须验证是否成功打开:
cpp
if (!infile.isopen()) {
cerr << "打开文件失败!错误码:" << strerror(errno) << endl;
return EXITFAILURE;
}
// 其他检查方法
infile.good(); // 状态正常
infile.fail(); // 操作失败
infile.eof(); // 到达文件末尾
五、文本文件读写实战
5.1 逐行读取文件
cpp
string line;
while (getline(infile, line)) {
cout << "读取到:" << line << endl;
}
5.2 写入格式化数据
cpp
outfile << "当前时间:" << time(nullptr) << endl;
outfile << setw(10) << left << "姓名" << "年龄" << endl;
5.3 处理不同数据类型
cpp
// 写入混合数据
outfile << 42 << ' ' << 3.14 << ' ' << "文本内容";
// 读取时需要注意顺序
int num;
double pi;
string text;
infile >> num >> pi >> text;
六、异常处理机制
建议使用异常捕获文件操作错误:
cpp
try {
ifstream fin;
fin.exceptions(ios::failbit | ios::badbit);
fin.open("nonexist.txt");
}
catch (const ios_base::failure& e) {
cerr << "文件操作异常:" << e.what() << endl;
}
七、文件指针控制
随机访问需要管理文件位置:
cpp
// 获取当前位置
streampos pos = infile.tellg();
// 跳转到文件开头
infile.seekg(0, ios::beg);
// 跳过20个字节
infile.seekg(20, ios::cur);
八、最佳实践建议
- RAII原则:利用构造函数自动打开,析构函数自动关闭
- 及时关闭:
close()
释放系统资源 - 缓冲机制:大量数据操作时考虑缓冲优化
- 跨平台注意:Windows换行是
\r\n
,Linux是\n
- 路径处理:建议使用
<filesystem>
(C++17)处理路径
cpp
// 现代C++文件操作示例
include
namespace fs = std::filesystem;
fs::path p{"data/output.txt"};
if (!fs::exists(p.parentpath())) {
fs::createdirectories(p.parent_path());
}
九、完整示例代码
cpp
include
include
include
int main() {
// 写入示例
std::ofstream out("demo.txt");
if (out) {
out << "第一行内容\n";
out << 42 << '\n';
out.close();
}
// 读取示例
std::ifstream in("demo.txt");
if (in) {
std::string line;
while (std::getline(in, line)) {
std::cout << line << '\n';
}
in.close();
}
return 0;
}
掌握这些基础知识后,您可以继续探索二进制文件操作、内存映射文件等高级主题。文件I/O是C++系统编程的重要基石,值得投入时间深入理解。