Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取文本文件时seekg()的奇怪偏移量_C++_Windows_File_Fstream_Seekg - Fatal编程技术网

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
(传递CRLF字节)。但是让我们先考虑一下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)