首页 > 编程笔记

C++ seekg()和seekp()用法详解

在 C++ 中,有时需要从特定的位置开始读写文件,可以通过调用文件流对象的 seekp() 和 seekg() 成员函数来改变这个位置。

文件输出流对象用 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 参数的值是一个枚举值,表示文件中的一些特殊位置,它的值有三种,分别是:

参数 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 对象进行了读写操作。请注意以下几点:

总结

seekg() 和 seekp() 函数用于移动文件的读和写指针。其中,seekg() 主要用于输入流(istream),而 seekp() 主要用于输出流(ostream)。

注意,调用 seekg() 或 seekp() 之后,最好都检查是否成功,可以通过if (stream.fail())来进行检查。

此外,seekg() 和 seekp() 在文本模式下可能不会如预期工作,尤其是在 Windows 系统上,建议在打开文件时使用二进制模式(ios::binary)。

推荐阅读