【发布时间】:2015-10-10 21:03:53
【问题描述】:
我正在寻找一种方法将我的 get 指针设置在 fstream 末尾的 x 位置。
我试过了
file.seekg(-x, ios_base::end);
但是根据this question,这行是未定义的行为。
- 我怎样才能以任何方式从 fstream 的末尾定位 x?
【问题讨论】:
我正在寻找一种方法将我的 get 指针设置在 fstream 末尾的 x 位置。
我试过了
file.seekg(-x, ios_base::end);
但是根据this question,这行是未定义的行为。
【问题讨论】:
如果你想将指针设置在距离末端 x 的位置,你需要知道末端在哪里,所以你需要开始:
file.seekg(0, ios_base::end);
int length = file.tellg();
当你知道文件长度后,你可以设置你的指针:
file.seekg(length - x, ios_base::beg);
【讨论】:
问题与文本模式有关,它可能会将文件中的某些字节序列转换为不同大小的序列。
以windows下的文本模式为例。这里磁盘上文件中的字节序列'\r' '\n'在读取时转换为'\n'。现在假设你有一个文件:
Hello\r\n
World\r\n
如果你将自己定位在file.seekg(-1, ios_base::end);,结果是不确定的,因为不清楚结果应该是什么:
'\n'?但是在这种情况下,以相反的顺序读取文件将与以正确的顺序读取文件不一致。 '\r',因为'\r' '\n'应该被理解为一个字节?但在这种情况下,定位必须逐字节完成,并且对于每个字节,库都必须检查前一个字节,以防万一。 顺便说一句,这也是为什么你应该只直接seekg() 到以前由tellg() 获得的职位的原因。
如果你真的要从头开始做这种定位,如果你以ios::binary打开文件,因为这样你就可以确定一个字节总是一个字节,无论是从尾数还是从头数。
【讨论】: