我正在寻找一种方法来将我的get指针设置在fstream末尾的位置x上。
我试过
file.seekg(-x, ios_base::end);
但根据this question,这一行是未定义的行为。
答案 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);