使用seekg()和seekp()控制读写指针实现随机访问,分别以ios::beg、ios::cur、ios::end为基准定位;2. 定位后用read()或write()读写数据,修改内容会覆盖原位置;3. 通过tellg()和tellp()获取当前指针位置,常用于计算文件大小或记录进度;4. 操作二进制文件时需以ios::binary模式打开,并检查文件是否成功打开。

在C++中使用
fstream进行随机访问,关键在于控制文件读写位置指针。通过
seekg()(用于读取)和
seekp()(用于写入),可以将指针移动到文件任意位置,实现非顺序的读写操作。
设置文件指针位置
seekg()和
seekp()分别用来设置输入和输出的位置指针。它们接受两个参数:偏移量和基准位置。
常用基准位置包括:
- ios::beg:从文件开头开始
- ios::cur:从当前位置开始
- ios::end:从文件末尾开始
例如:
立即学习“C++免费学习笔记(深入)”;
file.seekg(10, ios::beg); // 移动到第10个字节(从头算起) file.seekg(-5, ios::end); // 从末尾往前5个字节 file.seekg(20, ios::cur); // 当前位置往后20字节
读取指定位置的数据
使用
seekg()定位后,用
get()、
read()等方法读取数据。
示例:跳过前几个字节,读取中间一段内容
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。
fstream file("data.txt", ios::in | ios::binary);
if (file.is_open()) {
file.seekg(5); // 跳过前5个字节
char buffer[10];
file.read(buffer, sizeof(buffer));
// 此时buffer包含从第5字节开始的10个字节
}
修改文件中间内容
以读写模式打开文件,定位后直接写入新数据。
注意:写入不会改变文件总长度,只是覆盖原有内容。
fstream file("data.txt", ios::in | ios::out | ios::binary);
if (file.is_open()) {
file.seekp(10); // 定位到第10字节
file.write("NEW", 3); // 写入3字节
file.flush(); // 确保写入磁盘
}
获取当前指针位置
使用
tellg()和
tellp()可获取当前读/写位置。
常用于记录位置或计算已处理数据量。
file.seekg(0, ios::end); streampos fileSize = file.tellg(); // 获取文件大小 file.seekg(0); // 回到开头
基本上就这些。只要掌握
seekg、
seekp和
tellg、
tellp的配合使用,就能灵活实现文件的随机访问。操作二进制文件时尤其有用。记得检查文件是否成功打开,并注意文本模式与二进制模式的区别。









