2

我在使用 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 文件。

4

3 回答 3

3

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

因为它是 EOF 标记字符。

来自维基百科

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


如何避免这种错误终止

这不是“错误”的终止。


如何从这种状态中恢复?

你不需要。

如果您尝试读取预期会出现任意字符的“二进制文件”,您将以二进制模式打开文件流。

于 2013-01-31T03:31:15.623 回答
2

ASCII 字符 26 是 SUB 控制字符,在插入符号中是^Z. 您可能会将其识别为 Windows 文件结尾字符。因此,假设 ASCII 和 Windows,就可以了。

于 2013-01-31T03:21:39.583 回答
2

干得好:

Getline 和 16h (26d) 字符

看起来你必须编写自己的getline函数。似乎没有办法解决它:p 我知道,似乎没有其他人知道。如果有人知道更好的方法,请加入。

于 2013-01-31T03:24:24.433 回答