在 C++ 开发中,数据的持久化存储(读取文件、写入文件)是核心功能之一。C++ 流类库提供了面向对象、类型安全、使用简洁 的文件流 操作,通过 fstream 头文件中的三个文件流类,即可完成文本文件、二进制文件的读写。
本文从文件流类概述、文件打开与关闭、文本文件读写、二进制文件读写、文件定位五大核心模块,带你完全掌握 C++ 文件流操作。
一、C++ 文件流类概述
文件流是流类库专门用于文件操作的子类,包含在 <fstream> 头文件中。
1. 三大核心文件流类
表格
| 类名 | 作用 | 继承关系 | 常用操作 |
|---|---|---|---|
ifstream |
只读文件流 | 继承自 istream |
从文件读取数据 |
ofstream |
只写文件流 | 继承自 ostream |
向文件写入数据 |
fstream |
可读可写文件流 | 继承自 iostream |
同时读写文件 |
2. 文件操作基本流程
- 包含头文件
<fstream> - 创建文件流对象
- 打开文件(指定打开方式)
- 读写数据
- 关闭文件
二、文件打开模式(重要)
使用文件流必须指定打开模式,决定文件如何被操作。
常用打开模式
表格
| 模式 | 含义 |
|---|---|
ios::in |
只读方式打开(ifstream 默认) |
ios::out |
只写方式打开(ofstream 默认)覆盖原有内容 |
ios::app |
追加写入,不覆盖原有内容 |
ios::binary |
二进制模式打开 |
ios::trunc |
打开时清空文件 |
ios::ate |
打开后定位到文件末尾 |
组合使用
用 | 连接多种模式:
cpp
// 二进制 + 只读
ios::in | ios::binary
三、文件打开与关闭
1. 打开文件两种方式
方式 1:构造函数直接打开
cpp
ofstream fout("test.txt", ios::out);
方式 2:先创建对象,再调用 open()
cpp
ofstream fout;
fout.open("test.txt", ios::out);
2. 判断文件是否打开成功
必须判断!避免文件不存在 / 权限不足导致错误:
cpp
if (!fout.is_open()) {
cout << "文件打开失败!" << endl;
}
3. 关闭文件
操作完成后必须关闭,释放系统资源:
cpp
fout.close();
四、文本文件操作(最常用)
文本文件以字符形式存储,可直接用记事本打开。
1. 文本文件写入(ofstream)
cpp
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// 1. 创建写文件流
ofstream fout("info.txt", ios::out);
// 2. 判断是否打开成功
if (!fout.is_open()) {
cout << "打开失败" << endl;
return 1;
}
// 3. 写入数据(和 cout 用法一样)
fout << "姓名:张三" << endl;
fout << "年龄:20" << endl;
fout << "身高:175.5" << endl;
// 4. 关闭文件
fout.close();
cout << "写入完成" << endl;
return 0;
}
- 文本文件读取(ifstream)
cpp
int main() {
ifstream fin("info.txt", ios::in);
if (!fin.is_open()) {
cout << "打开失败" << endl;
return 1;
}
// 方法1:按字符串读取
string str;
while (fin >> str) { // 读到文件末尾自动结束
cout << str << endl;
}
// 方法2:按行读取
// char buf[1024];
// while (fin.getline(buf, sizeof(buf))) {
// cout << buf << endl;
// }
fin.close();
return 0;
}
五、二进制文件操作
二进制文件直接存储字节,速度更快、安全性更高,常用于图片、音频、结构体等。
关键函数
写:write(指针,大小)
读:read(指针,大小)
1. 二进制写入
cpp
// 结构体
struct Person {
char name[20];
int age;
};
int main() {
// 二进制写
ofstream fout("person.bin", ios::out | ios::binary);
Person p = {"李四", 22};
fout.write((const char*)&p, sizeof(Person));
fout.close();
return 0;
}
- 二进制读取
cpp
int main() {
ifstream fin("person.bin", ios::in | ios::binary);
Person p;
fin.read((char*)&p, sizeof(Person));
cout << p.name << " " << p.age << endl;
fin.close();
return 0;
}
六、文件随机读写(文件指针定位)
通过移动文件指针,实现任意位置读写。
核心函数
- 输出流(写) :
seekp(偏移量,基准位置) - 输入流(读) :
seekg(偏移量,基准位置)
基准位置
ios::beg:文件开头
ios::cur:当前位置
ios::end:文件末尾
示例:
cpp
// 定位到文件开头
fin.seekg(0, ios::beg);
// 定位到文件末尾
fin.seekg(0, ios::end);
// 获取当前指针位置
int pos = fin.tellg();
七、文件流常用判断函数
表格
| 函数 | 作用 |
|---|---|
is_open() |
文件是否成功打开 |
good() |
流状态正常 |
eof() |
是否到达文件末尾 |
fail() |
操作失败 |
clear() |
清除流错误状态 |
八、完整综合示例(可读可写 fstream)
cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// 可读可写
fstream fs("test.txt", ios::in | ios::out | ios::app);
if (!fs.is_open()) {
cout << "打开失败" << endl;
return 1;
}
// 写入
fs << "追加一行数据" << endl;
// 重新定位到开头读取
fs.seekg(0, ios::beg);
// 读取
string str;
while (getline(fs, str)) {
cout << str << endl;
}
fs.close();
return 0;
}
九、总结(核心要点)
- 文件流依赖头文件
<fstream> - 三大类:
ifstream(读)、ofstream(写)、fstream(读写) - 打开文件必须判断是否成功
- 文本文件:直接用
<<和>> - 二进制文件:用
read()和write() - 文件定位:
seekg/seekp - 操作完毕必须
close()
掌握以上内容,即可完成 C++ 所有文件操作需求,包括配置文件、数据存储、日志记录等。
总结
- 文件流 分为读、写、读写三类,使用
<fstream>头文件 - 打开模式 决定文件操作方式,
app追加、binary二进制 - 文本文件 读写简单直观,二进制文件效率高、适合结构化数据
- 文件指针可实现随机读写,灵活定位任意位置
- 文件操作必须:打开 → 判断 → 读写 → 关闭