使用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文件。答案 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)