C++ seekg()和seekp()用法详解
在 C++ 中,有时需要从特定的位置开始读写文件,可以通过调用文件流对象的 seekp() 和 seekg() 成员函数来改变这个位置。
文件输出流对象用 seekp() 函数,文件输入流对象用 seekg() 函数,它们各有另个重载版本,语法格式如下:
参数 way 参数的值是一个枚举值,表示文件中的一些特殊位置,它的值有三种,分别是:
参数 off 的值也是一个以字节为单位的整数,表示的是从 way 参数表示的位置处开始的偏移量,正数表示向前移动,负数表示向后移动。
当使用 fstream 对象时,可以用同一个流进行输入和输出操作,并使用 seekg() 和 seekp() 来控制读写指针的位置。下面是一个完整的示例,展示了如何使用 seekg() 和 seekp() 函数。
注意,调用 seekg() 或 seekp() 之后,最好都检查是否成功,可以通过
此外,seekg() 和 seekp() 在文本模式下可能不会如预期工作,尤其是在 Windows 系统上,建议在打开文件时使用二进制模式(ios::binary)。
文件输出流对象用 seekp() 函数,文件输入流对象用 seekg() 函数,它们各有另个重载版本,语法格式如下:
istream& seekg (streampos pos); istream& seekg (streamoff off, ios_base::seekdir way); ostream& seekp (streampos pos); ostream& seekp (streamoff off, ios_base::seekdir way);参数 pos 表示文件中的绝对位置(从文件起始处开始计算),即移动到参数指定的位置。
参数 way 参数的值是一个枚举值,表示文件中的一些特殊位置,它的值有三种,分别是:
- ios_base::beg:文件起始位置
- ios_base::cur:文件当前位置
- ios_base::end:文件结尾
参数 off 的值也是一个以字节为单位的整数,表示的是从 way 参数表示的位置处开始的偏移量,正数表示向前移动,负数表示向后移动。
当使用 fstream 对象时,可以用同一个流进行输入和输出操作,并使用 seekg() 和 seekp() 来控制读写指针的位置。下面是一个完整的示例,展示了如何使用 seekg() 和 seekp() 函数。
#include <iostream> #include <fstream> #include <string> int main() { // 打开文件进行读写 std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::app); if (!file) { std::cerr << "File cannot be opened!"; return 1; } // 使用 seekp 设置写指针位置,并添加一行 file.seekp(0, std::ios_base::end); file << "This is an appended line.\n"; // 使用 seekg 设置读指针位置,然后读取一行 std::string line; file.seekg(0, std::ios_base::beg); // 移到文件开始 std::getline(file, line); // 读取第一行 std::cout << "First Line: " << line << std::endl; // 使用 seekp 修改写指针位置,并更改一行内容 // 假设我们知道第二行从第 25 个字节开始(这通常需要你先确定) file.seekp(25, std::ios_base::beg); file << "This is the modified second line."; // 使用 seekg 读取修改后的第二行内容 file.seekg(25, std::ios_base::beg); // 移到第二行开始 std::getline(file, line); // 读取第二行 std::cout << "Modified Second Line: " << line << std::endl; // 关闭文件 file.close(); return 0; }示例中使用了 fstream 对象进行了读写操作。请注意以下几点:
- 用 seekp() 移动写指针并进行写入。
- 用 seekg() 移动读指针并进行读取。
总结
seekg() 和 seekp() 函数用于移动文件的读和写指针。其中,seekg() 主要用于输入流(istream),而 seekp() 主要用于输出流(ostream)。注意,调用 seekg() 或 seekp() 之后,最好都检查是否成功,可以通过
if (stream.fail())
来进行检查。此外,seekg() 和 seekp() 在文本模式下可能不会如预期工作,尤其是在 Windows 系统上,建议在打开文件时使用二进制模式(ios::binary)。