错误条件后的标准输入状态
Standard input state after error condition
以下代码片段摘自C++ Iostreams Handbook by Steve Teale
。它建议在无限循环中调用cin,以便不断提示用户输入正确的输入,只有输入正确的输入才退出循环。
此代码片段工作正常,但我对 if(cin){...}
语句感到困惑。我会期待像 if(!cin.fail()){...}
.
这样的东西
#include <limits.h>
#include <iostream>
using namespace std;
int main()
{
int n;
cin.unsetf(ios::skipws);
// turn off whitespece skipping
cout << "Enter a value for n, followed by [Enter]: " << flush;
for(;;) {
cin >> n;
if(cin) { //cin is in good state; input was ok
cin.ignore(INT_MAX, '\n');
// flush away the unwanted
// newline character
break;
}
// Poster's comment (not from the author)
// In this section of the code cin has evaluated to false
//
cin.clear(); // clear the error state
cin.ignore(INT_MAX, '\n');
// get rid of garbage characters
cout << "That was no good, try again: " << flush;
}
return 0;
}
Q) 在失败的情况下,cin 如何评估为 false(即零值或空值)?
cin 是一个对象,而不是可以设置为空的指针。此外,在 cin 求值为 false 的代码部分,我们仍然可以调用成员函数,如 clear
和 ignore
.
您观察到的是继承和隐式转换的结果。更具体地说,std::cin
有一个 operator bool()
将流的状态转换为布尔值,并且该运算符 returns !fail()
.
std::cin
是一个全局的 std::basic_istream
provided by the standard lib, and basic_istream
inherits from std::basic_ios
定义函数 operator bool()
继承链为:
std::ios_base <-- std::basic_ios <-- std::basic_istream
您可能会发现 this webpage 底部的 table 有助于将 operator bool()
与流的其他状态检查功能和流的不同状态标志进行比较。
以下代码片段摘自C++ Iostreams Handbook by Steve Teale
。它建议在无限循环中调用cin,以便不断提示用户输入正确的输入,只有输入正确的输入才退出循环。
此代码片段工作正常,但我对 if(cin){...}
语句感到困惑。我会期待像 if(!cin.fail()){...}
.
#include <limits.h>
#include <iostream>
using namespace std;
int main()
{
int n;
cin.unsetf(ios::skipws);
// turn off whitespece skipping
cout << "Enter a value for n, followed by [Enter]: " << flush;
for(;;) {
cin >> n;
if(cin) { //cin is in good state; input was ok
cin.ignore(INT_MAX, '\n');
// flush away the unwanted
// newline character
break;
}
// Poster's comment (not from the author)
// In this section of the code cin has evaluated to false
//
cin.clear(); // clear the error state
cin.ignore(INT_MAX, '\n');
// get rid of garbage characters
cout << "That was no good, try again: " << flush;
}
return 0;
}
Q) 在失败的情况下,cin 如何评估为 false(即零值或空值)?
cin 是一个对象,而不是可以设置为空的指针。此外,在 cin 求值为 false 的代码部分,我们仍然可以调用成员函数,如 clear
和 ignore
.
您观察到的是继承和隐式转换的结果。更具体地说,std::cin
有一个 operator bool()
将流的状态转换为布尔值,并且该运算符 returns !fail()
.
std::cin
是一个全局的 std::basic_istream
provided by the standard lib, and basic_istream
inherits from std::basic_ios
定义函数 operator bool()
继承链为:
std::ios_base <-- std::basic_ios <-- std::basic_istream
您可能会发现 this webpage 底部的 table 有助于将 operator bool()
与流的其他状态检查功能和流的不同状态标志进行比较。