如果输入流无效会发生什么?例如,如下所示:
int main()
{
int value;
while(!(cin>>value).eof());
}
如果输入的序列是:1 2 3 q 4 5,当cin扫描'q'并且值继续为3时,while将陷入无限循环。我的问题是:1.为什么cin不能忽略'q'并继续扫描 4?2.输入流的底层实现是什么?有什么材料可以参考吗?
谢谢!
如果输入流无效会发生什么?例如,如下所示:
int main()
{
int value;
while(!(cin>>value).eof());
}
如果输入的序列是:1 2 3 q 4 5,当cin扫描'q'并且值继续为3时,while将陷入无限循环。我的问题是:1.为什么cin不能忽略'q'并继续扫描 4?2.输入流的底层实现是什么?有什么材料可以参考吗?
谢谢!
- 为什么 cin 不能忽略 'q' 并继续扫描 4?
如果你愿意,你可以。您可以通过以下方式获得该效果:
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
}
- 输入流的底层实现是什么?有什么材料可以参考吗?
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
但是,您很可能会从一本好的 C++ 书籍中受益。
如果你想深入了解 iostreams,我也推荐这些文章。