设为首页 加入收藏

TOP

15.1.3 流式输出(2)
2013-10-07 15:35:10 来源: 作者: 【 】 浏览:73
Tags:15.1.3 流式 输出

15.1.3  流式输出(2)

下面这个函数通过put()方法,将C风格字符串的给定索引输出到控制台:

  1. void rawPutChar(const char* data, int charIndex)  
  2. {  
  3. cout.put(data[charIndex]);  
  4. }  
  5.  
  6. 代码取自Put\Put.cpp  

flush()

向输出流写入数据的时候,流不一定会将数据立即写入目标。大部分输出流都会进行缓冲,也就是积累数据,而不是立即将得到的数据写出去。当满足以下条件之一的时候,流进行刷新操作(flush),即将积累的数据写出:

到达某个标记的时候,例如endl标记。

流离开作用域被析构的时候。

要求从对应的输入流输入数据的时候(即要求从cin输入的时候,cout会刷新)。在有关文件流的小节中,您将学习如何建立这种连接。

流缓冲满的时候。

显式地要求流刷新缓冲的时候。

显式要求流刷新缓冲的方法是调用流的flush()方法,如下代码所示:

  1. cout << "abc";  
  2. cout.flush();       // abc is written to the console.  
  3. cout << "def";  
  4. cout << endl;       // def is written to the console.  
  5.  
  6. 代码取自Flush\fl ush.cpp  

不是所有的输出流都有缓冲。例如,cerr流就不会对输出缓冲。

3. 处理输出错误

输出错误可能会在多种情况下出现。有可能试图打开一个不存在的文件。有可能因为磁盘错误导致写入操作失败,例如磁盘已满。到目前为止,您所读到的使用了流的代码都没有考虑这些可能性,主要是为了代码简洁。然而,处理任何可能发生的错误是非常重要的。

当一个流处于正常的可用状态时,称这个流是"好的"。调用流的good()方法可以判断这个流当前是否处于好的状态。

  1. if (cout.good()) {  
  2. cout << "All good" << endl;  
  3. }  

通过good()可以方便地获得流的基本验证信息,但是不能提供流不可用的原因。还有一个bad()方法提供了稍多信息。如果bad()返回true,意味着发生了致命错误(相对于非致命错误,例如遇到文件结尾)。另一个方法fail()在最近一次操作失败的时候返回true,表示下一次操作也会失败。例如,对输出流调用flush()之后,可以调用fail()确保流仍然可用。
  1. cout.flush();  
  2. if (cout.fail()) {  
  3. cerr << "Unable to flush to standard out" << endl;  
  4. }  

还可以要求流在发生故障的时候抛出异常。然后可以编写一个catch处理程序来捕捉ios_base::failure异常,然后对这个异常调用what()方法获得错误的描述信息,调用code()方法获得错误代码。不过,是否能获得有用信息取决于编译器:

  1. cout.exceptions(ios::failbit | ios::badbit | ios::eofbit);  
  2. try {  
  3. cout << "Hello World." << endl;  
  4. } catch (const ios_base::failure& ex) {  
  5. cerr << "Caught exception: " << ex.what()  
  6. << ", error code = " << ex.code() << endl;  
  7. }  
  8.  
  9. 代码取自Exceptions\Exceptions.cpp  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇15.1.3 流式输出(3) 下一篇15.1.3 流式输出(1)

评论

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

·哈希表 - 菜鸟教程 (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)