核心函数:读写指针分离
C++将读指针和写指针分开管理,通过流对象控制。
1)移动指针:
- 读指针:
seekg
(g
=get
,输入流)
file.seekg(20, ios::beg); // 从文件头移动20字节
- 写指针:
seekp
(p
=put
,输出流)
file.seekp(-5, ios::end); // 移动到文件末尾前5字节
2)获取位置:
- 读位置:
tellg()
streampos pos = file.tellg();
- 写位置:
tellp()
streampos pos = file.tellp();
使用示例:独立控制读写
#include <fstream>
using namespace std;
int main() {
fstream file("data.bin", ios::in | ios::out | ios::binary);
// 1. 写指针移动到末尾,追加数据
if (!file.seekp(0, ios::end)) {
cerr << "读指针跳转失败!文件可能过小。" << endl;
}
file.write("XYZ", 3); // 写指针在末尾+3
// 2. 读指针移动到开头,读取数据
file.seekg(0, ios::beg);
char buffer[10];
file.read(buffer, 10); // 读指针在10字节处
// 3. 获取读写位置
cout << "读指针位置: " << file.tellg() << endl;
cout << "写指针位置: " << file.tellp() << endl;
file.close();
return 0;
}
注意事项
-
流类型限制:
•ifstream
只能seekg
/tellg
(读操作)。•
ofstream
只能seekp
/tellp
(写操作)。•
fstream
支持全部。 -
二进制模式:
和C语言一样,非文本文件必须用ios::binary
模式。
总结表格
函数 | 作用 | 适用流类型 |
---|---|---|
seekg | 移动读指针 | ifstream , fstream |
seekp | 移动写指针 | ofstream , fstream |
tellg | 获取读指针位置 | ifstream , fstream |
tellp | 获取写指针位置 | ofstream , fstream |
对比C语言
特性 | C语言 | C++ |
---|---|---|
指针管理 | 单一指针 | 读写指针独立 |
函数命名 | fseek , ftell | seekg , seekp , tellg/tellp |
错误处理 | 返回值检查 | 流状态检查(如 file.fail() ) |
适用场景 | 简单读写 | 复杂读写交替操作 |