C++ seekp()函数 和 seekg()函数

在C++中, seekg() seekp() 是流类的成员函数,用于在流的内部指针中进行定位。其中, seekg() 用于输入流(如 ifstream ), seekp() 用于输出流(如 ofstream )。

seekg() 函数

在C++中, seekg() 函数用于将文件读指针移动到特定位置。这个函数主要用于处理文件输入流,并允许你在文件中查找并读取指定位置的数据。

seekg() 函数的语法如下:

streampos seekg (streampos pos);
streampos seekg (streamoff off, ios_base::seekdir way);

其中, streampos 是一个类型,表示流的位置,而 streamoff 表示流中的偏移量。 ios_base::seekdir 是一个枚举类型,指定了相对于偏移量的查找方向。 ios_base 是一个类,定义了输入输出流类的基本特征。

第一种语法形式中, pos 表示要移动到的位置。 seekg() 函数返回的是当前读指针位置,也就是移动之前的位置。

第二种语法形式中, off 表示相对于查找方向的偏移量,而 way 则指定了查找方向。 way 可以取以下值之一:

  • ios_base::beg 表示相对于流的开头进行查找。
  • ios_base::cur 表示相对于当前读指针位置进行查找。
  • ios_base::end 表示相对于流的末尾进行查找。

seekg() 函数返回的是新的读指针位置。

下面是一个示例,演示了如何使用 seekg() 函数来读取文件中的特定数据:

#include <fstream>
#include <iostream>

int main() {
    std::ifstream file("example.txt");
    if (!file.is_open()) {
        std::cerr << "Failed to open file!\n";
        return 1;
    }

    // 获取文件大小
    file.seekg(0, std::ios::end);
    std::streampos fileSize = file.tellg();

    // 读取最后一个字符
    file.seekg(-1, std::ios::end);
    char lastChar;
    file.get(lastChar);

    std::cout << "File size: " << fileSize << " bytes\n";
    std::cout << "Last character: " << lastChar << "\n";

    file.close();
    return 0;
}

在这个示例中,我们首先打开文件,然后使用 seekg() 函数将读指针移动到文件的末尾,以获取文件大小。然后,我们使用 seekg() 函数将读指针移动到文件末尾的前一个位置,以读取最后一个字符。最后,我们输出文件大小和最后一个字符。

需要注意的是,在使用 seekg() 函数之前,我们需要确保文件已经成功打开,即判断文件是否打开成功。此外,我们还需要确保文件不为空,以避免使用 seekg() 函数失败。

总之, seekg() 函数是一个非常有用的函数,可以帮助我们在文件中定位特定的数据,进而更好地进行数据处理。

seekp() 函数

在 C++ 标准库中, seekp() 是一个与输出流关联的函数,用于设置文件写入位置。该函数用于定位文件指针,以便在文件的指定位置写入数据。

seekp() 函数的原型为:

streampos seekp (streampos pos);
streampos seekp (streamoff off, ios_base::seekdir way);

其中,第一个参数 pos 表示要设置的写入位置,类型为 streampos streampos 是一个类型,表示流中的某个位置,可以通过其他输入输出流函数(如 tellp() )获得。

第二个参数 off 表示相对于指定位置 way 的偏移量, way 表示寻找位置的方向。这两个参数的类型均为 streamoff ios_base::seekdir ,分别表示相对于当前位置的偏移量和指定偏移量的方向。 ios_base::seekdir 类型有三个值:

  • ios_base::beg :从文件开头开始定位。
  • ios_base::cur :从当前位置开始定位。
  • ios_base::end :从文件末尾开始定位。

例如,要从文件开头开始定位,可以使用以下代码:

file.seekp(0, ios_base::beg);

此外, seekp() 函数也可以用于对缓冲区进行定位。当使用 seekp() 函数改变文件指针位置时,如果当前缓冲区中存在未写入文件的数据,这些数据将被刷新到文件中。

需要注意的是,在某些情况下, seekp() 可能会导致在某些操作系统上的性能下降。因此,在使用 seekp() 时应该谨慎,并尽量避免多次调用该函数。

下面是一个简单的示例,演示如何使用 seekp() 函数将数据写入文件的指定位置:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    // 创建文件
    ofstream file("example.txt");

    // 向文件写入数据
    file << "Hello, World!";

    // 使用 seekp() 定位文件指针,并写入数据
    file.seekp(7);
    file << "C++";

    // 关闭文件
    file.close();

    return 0;
}

在此示例中,首先创建了一个名为 example.txt 的文件,并向其中写入了字符串 "Hello, World!"。然后,使用 seekp() 函数将文件指针定位到字符串中的第 7 个字符位置,并将字符串 "C++" 写入到该位置。最后,关闭文件。

执行该程序后, example.txt 文件的内容将变为 "Hello, C++ld!"。