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

时间:2015-07-21 12:04:38

标签: c++ fstream seekg

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

我试过

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

但根据this question,这一行是未定义的行为。

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

2 个答案:

答案 0 :(得分:5)

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

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

Hello\r\n
World\r\n

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

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

顺便提一下,这也是您应该seekg()直接tellg()之前获得的位置的原因。

如果你真的必须从头到尾进行这种定位,如果你打开文件为ios::binary因为那么你确信一个字节总是一个字节,无论是从结尾算起还是从开始。

答案 1 :(得分:4)

如果你想把你的指针设置在末尾的位置x,你需要知道结束的位置,所以你需要从:

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

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

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