15.1.4 流式输入(4)
3. 处理输入错误
输入流提供了一些方法用于检测异常情形。大部分和输入流有关的错误条件都发生在无数据可读的时候。例如,可能到达了流尾(称为文件尾,即使不是文件流)。查询输入流状态的最常见方法是在条件语句中访问输入流。例如,只要cin保持在"好的"状态,下面的循环持续进行:
- while (cin) { ... }
同时可以输入数据:- while (cin >> ch) { ... }
还可以调用good()方法,就像输出流那样。还有一个名为eof()的方法,如果流到达尾部的时候返回true。
您还应该养成一个读取数据后就检查流状态的习惯,这样可以从异常输入中恢复。
下面的程序展示了从流中读取数据并处理错误的常用模式。这个程序从标准输入中读取数字,到达文件结尾的时候显示这些数字的总和。注意在命令行环境中,需要用户键入一个特殊的字符表示文件结束。在Unix和Linux中,这个特殊的字符是Control+D,在Windows中为Control+Z。具体的字符与操作系统相关,因此您还需要了解操作系统要求的字符:
- cout << "Enter numbers on separate lines to add. "
- << "Use Control+D to finish (Control+Z in Windows)." << endl;
- int sum = 0;
- if (!cin.good()) {
- cerr << "Standard input is in a bad state!" << endl;
- return 1;
- }
- int number;
- while (true) {
- cin >> number;
- if (cin.good()) {
- sum += number;
- } else if (cin.eof()) {
- break; // Reached end of file
- } else {
- // Error!
- cin.clear(); // Clear the error state.
- string badToken;
- cin >> badToken; // Consume the bad input.
- cerr << "WARNING: Bad input encountered: " << badToken << endl;
- }
- }
- cout << "The sum is " << sum << endl;
- 代码取自ErrorCheck\ErrorCheck.cpp
4. 输入操作算子
下面的列表中列出了内建的输入操作算子,输入操作算子可以发送到输入流中以便自定义数据读入的行为。
boolalpha和noboolalpha:如果使用了boolalpha,字符串false会解释为布尔值false;其他任何字符串都会被解释为布尔值true。如果设置了noboolalpha,0会被解释为false,其他任何值都被解释为true。默认行为是noboolalpha。
hex、oct和dec:分别以十六进制、八进制和十进制读入数字。
skipws和noskipws:告诉输入流在标记化的时候跳过空白字符,或者读入空白字符作为标记。
ws:一个简便的操作算子,表示跳过流中当前位置的一串空白字符。
[C++(www.cppentry.com)11] get_money:从流中读入一个货币值。
[C++(www.cppentry.com)11] get_time:从流中读入一个格式化的时间值。
输入支持locale。例如,下面的代码将cin的locale设置为系统locale。第14章讨论了locale:
- cin.imbue(locale(""));
- int i;
- cin >> i;
如果系统locale为U.S. English,那么输入1,000会被解析为1000。如果系统locale为Dutch Belgium,那么输入1.000会被解析为1000。