fstream - 如何seekg()从末尾定位x

use*_*533 3 c++ fstream seekg

我正在寻找一种方法来将我的get指针设置在fstream末尾的位置x.

我试过了

file.seekg(-x, ios_base::end);
Run Code Online (Sandbox Code Playgroud)

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

  • 我怎么能以任何方式寻求从fstream的末尾定位x?

Blo*_*ood 5

如果要将指针从末尾设置在位置x,则需要知道末尾在哪里,因此需要从以下位置开始:

file.seekg(0, ios_base::end);
int length = file.tellg();
Run Code Online (Sandbox Code Playgroud)

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

file.seekg(length - x, ios_base::beg);
Run Code Online (Sandbox Code Playgroud)


Chr*_*phe 5

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

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

Hello\r\n
World\r\n
Run Code Online (Sandbox Code Playgroud)

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

  • 你应该只是定位在'\n'?但在这种情况下,以相反的顺序读取文件将与以正确的顺序读取文件不一致.
  • 应该将它定位在'\r','\r' '\n'应该被理解为单个字节?但在这种情况下,定位必须逐字节完成,并且对于每个字节,库必须检查前一个字节,以防万一.

顺便说一句,这也是你应该只直接seekg()获得之前获得的位置的原因tellg().

如果你真的必须ios::binary从头到尾做这种定位,如果你打开文件因为那样你就可以确保一个字节总是一个字节,无论是从结尾算起还是从头开始算.