如果输入流无效,会发生什么

时间:2013-10-29 03:13:01

标签: c++ inputstream

如果输入流无效,会发生什么?例如,如下:

int main()
{
    int value;
    while(!(cin>>value).eof());
}

如果输入的序列是:1 2 3 q 4 5,当cin扫描“q”时,while将进入无限循环。而且价值仍然是3。 我的问题是: 1.为什么不能忽视' q'并继续扫描4? 2.输入流的基础实现是什么?我可以参考哪些材料?

谢谢!

1 个答案:

答案 0 :(得分:3)

  
      
  1. 为什么不能忽略'q'并继续扫描4?
  2.   

如果你愿意,你可以。您可以通过以下方式获得该效果:

int value;
while(std::cin>>value);
if (!std::cin)
{
    std::cin.clear(); // clear error state
    std::cin.ignore(); // ignore the q
    while(std::cin>>value); // read rest of values until 5
}

std::cin >> value默认情况下不这样做,因为所需的行为因程序而异。对于许多人来说,std::cin忽略读取失败并继续扫描是不可取的。默认行为允许程序员决定失败时该怎么做。

另请注意,eof()用于检查文件结尾。您不应该使用它来检查读取是否成功。常见的习语是:

while(std::cin>>value)
{
    // Do stuff
}
  
      
  1. 输入流的基本实现是什么?有没有我可以参考的材料?
  2.   

std::cin是一个全局静态对象,定义如下:

extern std::istream cin;

换句话说,它是std::basic_istream<char>的一个实例(std :: istream是一个typedef)。

如果您想了解更多信息,请参阅以下内容:

http://en.cppreference.com/w/cpp/io/cin

https://github.com/cplusplus/draft

但是,您很可能会受益于good C++ book

如果您想深入了解iostream,我还建议these articles