fstream - 如何使用seekg()函数从文件末尾定位到位置x

8
我希望您能够提供一种方法,将我的get指针设置在fstream结尾的第x个位置。
我尝试过:
file.seekg(-x, ios_base::end);

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

  • 我如何以任何方式寻求从fstream的末尾定位x?
2个回答

11

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

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

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

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

抱歉,我的错。我把你的解决方案和 tellg() - x 搞混了。赞。 - user2962533

9
问题与文本模式有关,它可能会将文件中的某些字节序列转换为不同大小的序列。例如,在Windows下的文本模式中,磁盘上文件中的字节序列'\r' '\n'在读取时被转换为'\n'。现在想象一下你有一个文件:
Hello\r\n
World\r\n

如果您将自己定位在file.seekg(-1, ios_base::end);,结果是不确定的,因为不清楚结果应该是什么:
  • 您应该只定位在'\n'吗?但是,在这种情况下,以相反顺序读取文件将与以正确顺序读取文件不一致。
  • 它应该定位在'\r',因为'\r''\n'应被视为单个字节吗?但是,在这种情况下,必须逐字节进行定位,并且对于每个字节,库都必须检查前一个字节,以防万一。
顺便说一下,这也是为什么您应该只直接使用tellg()获取的位置来执行seekg()的原因。
如果确实需要从末尾执行此类定位,则应将文件打开为ios::binary,因为这样可以确保无论从末尾还是从开头计数,每个字节始终是一个字节。

非常感谢您解释为什么它是未定义行为。 - user2962533

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接