设为首页 加入收藏

TOP

15.1.4 流式输入(4)
2013-10-07 15:35:25 来源: 作者: 【 】 浏览:74
Tags:15.1.4 流式 输入

15.1.4  流式输入(4)

3. 处理输入错误

输入流提供了一些方法用于检测异常情形。大部分和输入流有关的错误条件都发生在无数据可读的时候。例如,可能到达了流尾(称为文件尾,即使不是文件流)。查询输入流状态的最常见方法是在条件语句中访问输入流。例如,只要cin保持在"好的"状态,下面的循环持续进行:

  1. while (cin) { ... } 

同时可以输入数据:
  1. while (cin >> ch) { ... } 

还可以调用good()方法,就像输出流那样。还有一个名为eof()的方法,如果流到达尾部的时候返回true。

您还应该养成一个读取数据后就检查流状态的习惯,这样可以从异常输入中恢复。

下面的程序展示了从流中读取数据并处理错误的常用模式。这个程序从标准输入中读取数字,到达文件结尾的时候显示这些数字的总和。注意在命令行环境中,需要用户键入一个特殊的字符表示文件结束。在Unix和Linux中,这个特殊的字符是Control+D,在Windows中为Control+Z。具体的字符与操作系统相关,因此您还需要了解操作系统要求的字符:

  1. cout << "Enter numbers on separate lines to add. "  
  2. << "Use Control+D to finish (Control+Z in Windows)." << endl;  
  3. int sum = 0;  
  4. if (!cin.good()) {  
  5. cerr << "Standard input is in a bad state!" << endl;  
  6. return 1;  
  7. }  
  8. int number;  
  9. while (true) {  
  10. cin >> number;  
  11. if (cin.good()) {  
  12. sum += number;  
  13. } else if (cin.eof()) {  
  14. break; // Reached end of file  
  15. } else {  
  16. // Error!  
  17. cin.clear(); // Clear the error state.  
  18. string badToken;  
  19. cin >> badToken; // Consume the bad input.  
  20. cerr << "WARNING: Bad input encountered: " << badToken << endl;  
  21. }  
  22. }  
  23. cout << "The sum is " << sum << endl;  
  24. 代码取自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:

  1. cin.imbue(locale(""));  
  2. int i;  
  3. cin >> i;  

如果系统locale为U.S. English,那么输入1,000会被解析为1000。如果系统locale为Dutch Belgium,那么输入1.000会被解析为1000。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇15.1.1 流的含义 下一篇15.1.4 流式输入(3)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)
·索引堆及其优化 - 菜 (2025-12-24 20:18:50)
·Shell 中各种括号的 (2025-12-24 19:50:39)
·Shell 变量 - 菜鸟教 (2025-12-24 19:50:37)