15.1.3 流式输出(2)
下面这个函数通过put()方法,将C风格字符串的给定索引输出到控制台:
- void rawPutChar(const char* data, int charIndex)
- {
- cout.put(data[charIndex]);
- }
-
- 代码取自Put\Put.cpp
flush()
向输出流写入数据的时候,流不一定会将数据立即写入目标。大部分输出流都会进行缓冲,也就是积累数据,而不是立即将得到的数据写出去。当满足以下条件之一的时候,流进行刷新操作(flush),即将积累的数据写出:
到达某个标记的时候,例如endl标记。
流离开作用域被析构的时候。
要求从对应的输入流输入数据的时候(即要求从cin输入的时候,cout会刷新)。在有关文件流的小节中,您将学习如何建立这种连接。
流缓冲满的时候。
显式地要求流刷新缓冲的时候。
显式要求流刷新缓冲的方法是调用流的flush()方法,如下代码所示:
- cout << "abc";
- cout.flush(); // abc is written to the console.
- cout << "def";
- cout << endl; // def is written to the console.
-
- 代码取自Flush\fl ush.cpp
不是所有的输出流都有缓冲。例如,cerr流就不会对输出缓冲。
3. 处理输出错误
输出错误可能会在多种情况下出现。有可能试图打开一个不存在的文件。有可能因为磁盘错误导致写入操作失败,例如磁盘已满。到目前为止,您所读到的使用了流的代码都没有考虑这些可能性,主要是为了代码简洁。然而,处理任何可能发生的错误是非常重要的。
当一个流处于正常的可用状态时,称这个流是"好的"。调用流的good()方法可以判断这个流当前是否处于好的状态。
- if (cout.good()) {
- cout << "All good" << endl;
- }
通过good()可以方便地获得流的基本验证信息,但是不能提供流不可用的原因。还有一个bad()方法提供了稍多信息。如果bad()返回true,意味着发生了致命错误(相对于非致命错误,例如遇到文件结尾)。另一个方法fail()在最近一次操作失败的时候返回true,表示下一次操作也会失败。例如,对输出流调用flush()之后,可以调用fail()确保流仍然可用。- cout.flush();
- if (cout.fail()) {
- cerr << "Unable to flush to standard out" << endl;
- }
还可以要求流在发生故障的时候抛出异常。然后可以编写一个catch处理程序来捕捉ios_base::failure异常,然后对这个异常调用what()方法获得错误的描述信息,调用code()方法获得错误代码。不过,是否能获得有用信息取决于编译器:
- cout.exceptions(ios::failbit | ios::badbit | ios::eofbit);
- try {
- cout << "Hello World." << endl;
- } catch (const ios_base::failure& ex) {
- cerr << "Caught exception: " << ex.what()
- << ", error code = " << ex.code() << endl;
- }
-
- 代码取自Exceptions\Exceptions.cpp