C++ 读取文本文件时seekg()的奇怪偏移量
我试图使用这里描述的逻辑获取文件的最后一行,但我得到了一些奇怪的异常:C++ 读取文本文件时seekg()的奇怪偏移量,c++,windows,file,fstream,seekg,C++,Windows,File,Fstream,Seekg,我试图使用这里描述的逻辑获取文件的最后一行,但我得到了一些奇怪的异常: score.seekg(-2, ios::cur); 将我的流重置为相同的字符,因此我得到无限循环。但是,将其设置为-3非常有效: fstream score("high_scores.txt"); //open file if(score.is_open()) //file exist { score.seekg(0, ios::end); char tmp = '~'; while(t
score.seekg(-2, ios::cur);
将我的流重置为相同的字符,因此我得到无限循环。但是,将其设置为-3
非常有效:
fstream score("high_scores.txt"); //open file
if(score.is_open()) //file exist
{
score.seekg(0, ios::end);
char tmp = '~';
while(tmp != '\n')
{
score.seekg(-3, ios::cur);
if((int)score.tellg() <= 0) //start of file is start of line
{
score.seekg(0);
break;
}
tmp = score.get();
cout << tmp << "-";
}
}
我正在使用Windows,所以现在我明白了为什么需要从文件末尾偏移-3
(传递CR和LF字节)。但是让我们先考虑一下char(从结尾)。< /P>
因此,流到达
7
。它提取它,并移动到CR字节。然后,如果在下一个循环迭代中我们将其偏移-3
,我们将得到0
,但不是1
!但实际上,我得到了1
!并且,所有这些都可以在-3
偏移量下正常工作。这对我来说是个谜。我无法忘怀。我希望这能说明发生了什么:
28 Mon Jul 10 16:11:24 2017CL <- C = CR, L = LF
6543210 <- position relative to ios::end
| || |
| || * Start after seekg(0, ios::end)
| *| After first seekg(-3, ios::cur)
| * After first get()
* After second seekg(-3, ios::cur)
28周一2017年7月10日16:11:24请出示一份礼物。很难看出问题的具体位置。这很可能是由行尾样式(DOS vs Unix)引起的问题。在十六进制编辑器或编辑器中查看文件时,可以显示文件中每个字符的十进制或十六进制值。另一种方法是以二进制打开文件,并以十六进制或十进制显示每个字符。这将显示行尾是CR、LF(0x0d、0x0a)还是仅LF(0x0a)。@ThomasMatthews确实有0d、0a行尾。Windows特定的东西?好的,但是这会如何影响非尾行字符呢?像流经过0a和0d,得到最后一个字符,移动+1位置。如果现在,我们将-3偏移到当前位置,理论上,我们得到的不是第二个字符,而是第三个字符(从末尾开始)!但我们得到了第二…每行结束字符计数定位。-2应位于最后一个字母“7”的位置。A-3应定位到“1”。至少,这是我的理解。等等,你犯了一个小错误:不是seekg(-3,ios::end)是seekg(-3,ios::cur)!理论上,我应该在第二个seekg后得到0,但是异常情况发生了。事实上,我在7之后得到1,然后是0,2,空格,4,2,等等,一切都很好。这不是很奇怪吗?我无法解释这个。。。这就像get()在提取字符后将指针向前推进2,而不是1。但这是不可能的?对吗?谢谢,我把错字搞定了!但是如果你得到的是1
,而不是0
,那确实很奇怪<对于正常的fstream
,code>get()
不应将指针提前两个字节。
28 Mon Jul 10 16:11:24 2017
28 Mon Jul 10 16:11:24 2017CL <- C = CR, L = LF
6543210 <- position relative to ios::end
| || |
| || * Start after seekg(0, ios::end)
| *| After first seekg(-3, ios::cur)
| * After first get()
* After second seekg(-3, ios::cur)