参考: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. 记录python接口自动化测试--把测试结果写进excel文件(第九目)

    python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取 ...

  2. 2017-09-21xlVBA_蒸发SQL循环查询1

    'ARRAY("1991","1992","1993","1994","1996","19 ...

  3. android -------- 错误Attribute application@allowBackup value=(true) from AndroidManifest.xml

    开发中遇到一个问题,运行项目时,出现了一个这如下这样的问题 问题: Manifest merger failed : Attribute application@allowBackup value=( ...

  4. Python中单线程、多线程和多进程的效率对比实验

    GIL机制导致如下结果: Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)python多线程适合io操作密集型的任务(如sock ...

  5. 关于js原型链

    关于原型链,我们先贴上一张图(来自某知乎大佬专栏),然后听我娓娓道来. 先来说说什么是原型? JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引 ...

  6. org.springframework.web.bind.annotation重定向的问题

    @RequestMapping(value="/redir/authcode") public ModelAndView getAuthCode(){ String authUrl ...

  7. ASP.NET Core WebAPI 开发-新建WebAPI项目 转

    转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目   ASP.NET Core We ...

  8. Xshell中文乱码怎么处理?

    改成如下图:

  9. 字符序列(characts)

    字符序列(characts) 问题描述: 从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的 子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而 ...

  10. iOS架构设计系列之解耦的尝试之变异的MVVM

    最近一段时间,在思考如何合理的架构一个可扩展性良好的界面编程方式.这一部分的成果做成了一个叫ElementKit的库.目前功能在不断的完善中. 关于iOS的架构,看多了MVVM,VIPER,MVC,M ...