流中的奇怪eof标志

时间:2013-01-31 03:14:07

标签: c++

使用c ++文件流解析文本文件时遇到了一个奇怪的问题。这是代码:

while (true)
{       
    std::getline(inFile, line);
    if (!inFile.good())
    {
        std::cout << "Fail, bad and eof flags:" << inFile.fail() << inFile.bad() << inFile.eof() << std::endl;
        break;
    }
    parseLine(line);        
}   

当读取终止时,输出为:

Fail, bad and eof flags:001

但实际上读者并未到达文件末尾。我打开文件,发现下一个字符实际上是26(ASCII码)。那么问题是:1)为什么在读取这个字符时设置了eof标志,以及如何避免这种错误终止? 2)如何从这种状态中恢复?谢谢!

PS:感谢回复。如果我以二进制模式读取文件怎么办?更好的解决方案?我使用的是Windows平台,但该文件似乎是一个unix文件。

3 个答案:

答案 0 :(得分:3)

  

为什么在读取此字符时设置了eof标志

因为它是EOF标记字符。

来自Wikipedia

  

Microsoft的DOS和Windows (以及在CP / M和许多DEC操作中   系统),从终端读取永远不会产生EOF。   相反,程序认识到源是终端(或其他终端)   “character device”)和解释给定的保留字符或   序列作为文件结束指示符;最常见的是这是一个ASCII   Control-Z,代码26。


  

如何避免这种错误终止

这不是“假”终止。


  

如何从这种状态恢复?

你不需要。

如果您尝试读取可能需要任意字符的“二进制文件”,则可以以二进制模式打开文件流。

答案 1 :(得分:2)

ASCII字符26是SUB控制字符,其符号表示为^Z。这可能是您可以识别的Windows文件结束字符。所以假设有ASCII和Windows,那么就去吧。

答案 2 :(得分:2)

你走了:

Getline and 16h (26d) character

看起来您必须编写自己的 getline 功能。似乎没有办法绕过它:p我知道,似乎没有人知道。如果有人知道更好的方式,请加入。