我正在寻找一种方法来将我的get指针设置在fstream末尾的位置x.
我试过了
file.seekg(-x, ios_base::end);
Run Code Online (Sandbox Code Playgroud)
但根据这个问题,这一行是未定义的行为.
如果要将指针从末尾设置在位置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)
该问题与文本模式有关,文本模式可以将文件中的某些字节序列转换为不同大小的序列.
以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从头到尾做这种定位,如果你打开文件因为那样你就可以确保一个字节总是一个字节,无论是从结尾算起还是从头开始算.