5

I'm looking for a way to set my get pointer at position x from the end of an fstream.

I tried

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

But according to this question, this line is undefined behavior.

  • How can I, in any way, seek to position x from the end of a fstream?
4

2 回答 2

8

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

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

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

file.seekg(length - x, ios_base::beg);
于 2015-07-21T12:32:36.983 回答
8

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

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

Hello\r\n
World\r\n

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

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

顺便说一句,这也是为什么你应该只直接seekg()到以前获得的职位的原因tellg()

如果你真的要从头开始做这种定位,如果你打开文件是ios::binary因为,那么你就可以确定一个字节总是一个字节,无论是从尾数还是从头数。

于 2015-07-21T12:38:45.187 回答