参考:http://www.weixueyuan.net/view/6408.html

总结:

  iostream头文件,包含了该头文件后,我们就可以直接使用这些对象,包含标准的输出流对象cout、cerr和clog以及标准输入流对象cin等。

  所谓标准输出其实就是向标准输出设备进行输出,通常来讲我们可以将标准输出设备理解为显示器。    

  系统声明的三个标准输出流对象cout、cerr和clog中,cerr和clog对象都是标准错误流,不同的是cerr是直接将错误信息输出到显示器,而clog则不同,clog是将错误信息先写入到缓冲区,待清扫缓冲区时,再将错误内容输出到显示器中。

  与cerr和clog对象不同,cout对象则非错误流,而只是普通的输出流,该对象在进行输出时,也会经过先缓冲区,然后再输出到显示器。

  endl会带来一次清扫缓冲区动作。

---------------------------

在程序设计过程中不可避免地要进行输入与输出操作,在前面章节列举示例程序时我们通常都会加上一个包含iostream头文件,我们之所以包含该文件,那是因为在该头文件中,系统声明了输入输出类的对象,包含了该头文件后,我们就可以直接使用这些对象了。这些对象中包含标准的输出流对象cout、cerr和clog以及标准输入流对象cin等。我们这一节先来了解一下标准输出流的三个对象:cout、cerr和clog。

所谓标准输出其实就是向标准输出设备进行输出,通常来讲我们可以将标准输出设备理解为显示器。系统声明的三个标准输出流对象cout、cerr和clog中,cerr和clog对象都是标准错误流,不同的是cerr是直接将错误信息输出到显示器,而clog则不同,clog是将错误信息先写入到缓冲区,待清扫缓冲区时,再将错误内容输出到显示器中。与cerr和clog对象不同,cout对象则非错误流,而只是普通的输出流,该对象在进行输出时,也会经过先缓冲区,然后再输出到显示器。

例1:

#include<iostream>
using namespace std; enum index { underflow, overflow }; int array_index ( int *A, int n, int index ); int main()
{
int *A = new int [ ];
for ( int i = ; i < ; i ++ )
A[i] = i;
try
{
cout << array_index( A,, ) << endl;
}
catch( index e )
{
if( e == underflow )
{
cerr << "index underflow!" << endl;
}
if( e == overflow )
{
cerr << "index overflow!" << endl;
}
}
//index underflow test!
try
{
cout << array_index( A,,- ) << endl;
}
catch( index e )
{
if( e == underflow )
{
cerr << "index underflow!" << endl;
}
if( e == overflow )
{
cerr << "index overflow!" << endl;
}
}
// index overflow test!
try
{
cout << array_index( A,, ) << endl;
}
catch( index e )
{
if( e == underflow )
{
clog << "index underflow!" << endl;
}
if( e == overflow )
{
clog << "index overflow!" << endl;
}
}
return ;
} int array_index( int *A, int n, int index )
{
if ( index < ) throw underflow;
if ( index > n- ) throw overflow;
return A[index];
}

在该程序中我们同时使用到了cout、cerr和clog对象,cout对象我们早已经不陌生,在前面几乎所有的例程中输出都是用的它,cerr和clog用于错误信息输出,它的使用方式其实和cout时一样的,在本例中我们将其用于输出异常信息。当访问数组出现下标越界时,程序就抛出异常,然后会被catch程序块捕获并在程序块中输出异常信息。在本例中我们如果将程序中的所有cerr全都替换为clog或者将所有clog全都替换为cerr,程序的输出结果是不会变化的,从这点看这两者似乎是没什么差别,其实差别在是否经过缓冲区,不过本例是无法体现出差别的,因为在输出异常信息的同时,endl会带来一次清扫缓冲区动作,因此经不经过缓冲区是无法得以体现的。cerr和clog之间的细微差别,我们只要做到心中有数就可以了。

 

8.2 C++标准输出流对象的更多相关文章

  1. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  2. java IO流 之 其他流

    一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一).   public class ByteArrayInputStream extends ...

  3. 01从c到c++

    c++的发展历史  + 80年代贝尔实验室 本贾尼 + 83年 正式命名c++ + 87年 gnu制定了c++标准 + 92年 微软和IBM分别制定了c++标准 + 98年 ansi ISO 制定了标 ...

  4. C++学习48 对ASCII文件的读写操作

    如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...

  5. javaSE第二十二天

    第二十二天    312 1:登录注册IO版本案例(掌握)    312 2:数据操作流(操作基本类型数据的流)(理解)    313 (1)定义:    313 (2)流对象名称    313 (3 ...

  6. C++:流类库与输入输出

    7.2.1 C++的输入输出流 ios:流基类(抽象类) istream:通用输入流类和其他输入流的基类 ostream:通用输出流类和其他输出类的基类 iostream:通用输入输出流类和其他输入输 ...

  7. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  8. 【转载】C++的文件和流

    http://www.iteedu.com/plang/ccpp/cppdxjch2b/111.php C++语言把每一个文件都看成一个有序的字节流(见图14.2),每一个文件或者以文件结束符(end ...

  9. (JAVA)从零开始之--打印流PrintStream记录日志文件

    这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. File file = new Fil ...

随机推荐

  1. 干货|基于 Spring Cloud 的微服务落地

    转自 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的 ...

  2. fMRI在认知心理学上的研究

    参考:Principles of fMRI 1 问题: 1. fMRI能做什么不能做什么? 第一周:fMRI简介,data acquisition and reconstruction 大致分为两类: ...

  3. java ----> 类转换异常

    com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy 两个原因: 1.懒加载 在we ...

  4. English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式

    In this lesson you will learn to talk about the past. 课上内容(Lesson) I was born in 1986. I started sch ...

  5. FreeBSD之基本配置

    1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0"   #设置 ...

  6. anaconda安装tensorflow

    1.下载anaconda python3.5版本,Windows不支持python3.6,linux和mac支持python2.7和python3.3+ 2.创建环境   conda create - ...

  7. Spring Batch 基本的批处理指导原则

    下面是一些关键的指导原则,可以在构批量处理解决方案可以参考: 请记住,通常皮脸处理体系结构将会影响在线应用的体系结构,同时反过来也是一样的.在你为批量任务和在线应用进行设计架构和环境的时候请尽可能的使 ...

  8. java把类似a=1&b=2&c=3的String类型数据转成map集合

    public static Map<String, Object> transStringToMap(String mapString, String separator, String ...

  9. h5网页跳转到app,若未安装app,则跳转app下载页面

    if(isAndroid){ android(); function android(){ var ifr = document.createElement("iframe"); ...

  10. WCF开发实战系列一:创建第一个WCF服务 转

    转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811064.html 在这个实战中我们将使用DataContract,Servic ...