格式化输入函数的工作非常简单:
- 如果有的话,它们会跳过前导空格。
- 他们尝试读取与给定类型匹配的格式。
- 如果由于数据与所需格式不匹配而导致读取值失败,则设置
std::ios_base::failbit
. 如果读取失败,则输入不应更改尝试读取的变量(标准输入运算符遵循此规则,但用户定义的输入运算符可能不会)。
您尝试读取的第一个值是int
. 读取 anint
意味着读取可选的前导符号后跟一系列数字(根据您的设置和给定的值,流可能读取八进制或十六进制数字而不是十进制数字)。也就是说,int
接收值3
并且读取在 . 前面停止.
。
根据您接下来阅读的内容,下一次阅读是否失败:
- 在第一个代码中,您尝试读取以可选符号开头的浮点值,然后是可选的整数部分,然后是可选的千位分隔符,然后是可选的小数部分,然后是可选的指数。整数部分或小数部分至少需要一位数字。在您的示例中,只有数千个单独的后跟小数部分。
- 尝试读取整数时,
.
发现 a 不是 a 的有效部分int
并且读取失败。
尝试读取值后,应始终尝试读取操作是否成功并报告潜在错误:
if (in >> value) {
std::cout << "successfully read '" << value << "'\n";
}
else {
std::cerr << "failed to read a value from input\n";
}
请注意,在读取失败后,您可能还需要清理,例如,使用
in.clear();
in.ignore();
这首先清除错误标志(没有这个,流将忽略任何进一步读取数据的尝试),然后忽略下一个字符。