如何查找()从end开始定位x

How to seekg() to position x from end

本文关键字:开始 定位 end 查找 何查找      更新时间:2023-10-16

我正在寻找一种方法来设置我的get指针在位置x从fstream结束

我试着

file.seekg(-x, ios_base::end);

但是根据这个问题,这一行是未定义的行为。

  • 我怎么能,以任何方式,从流的结尾寻求x的位置?

如果你想将指针设置在距离结束的x位置,你需要知道结束的位置,所以你需要以:

开始:
file.seekg(0, ios_base::end);
int length = file.tellg();

当你知道文件的长度时,你可以设置你的指针:

file.seekg(length - x, ios_base::beg);

问题与文本模式有关,该模式可能会将文件中的某些字节序列转换为不同大小的序列。

以Windows下的文本模式为例。在这里,磁盘上文件中的字节序列'r' 'n'在读取时被转换为'n'。现在假设您有一个文件:

Hellorn
Worldrn

如果你定位自己在file.seekg(-1, ios_base::end);的结果是未定义的,因为它不清楚的结果应该是:

  • 你应该简单地定位在'n'吗?但是在这种情况下,以相反的顺序读取文件将与以正确的顺序读取文件不一致。
  • 它应该定位在'r',因为'r' 'n'应该被理解为单个字节?但是在这种情况下,定位必须一个字节一个字节地进行,对于每个字节,库都必须检查前一个字节,以防。

顺便说一下,这也是为什么你只应该直接seekg()tellg()之前获得的位置。

如果你必须从末尾开始做这种定位,如果你以ios::binary打开文件因为这样你就可以保证一个字节永远是一个字节无论从末尾开始计数还是从开始计数