• 8.2 C++标准输出流对象


    参考: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 [ 10 ];
        for ( int i = 0; i < 10; i ++ )
            A[i] = i;
        try
        {
            cout << array_index( A,10,5 ) << 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,10,-1 ) << 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,10,15 ) << endl;
        }
        catch( index e )
        {
            if( e == underflow )
            {
                clog << "index underflow!" << endl;
            }
            if( e == overflow )
            {
                clog << "index overflow!" << endl;
            }
        }
        return 0;
    }
    
    int array_index( int *A, int n, int index )
    {
        if ( index < 0 ) throw underflow;
        if ( index > n-1 ) throw overflow;
        return A[index];
    }
    在该程序中我们同时使用到了cout、cerr和clog对象,cout对象我们早已经不陌生,在前面几乎所有的例程中输出都是用的它,cerr和clog用于错误信息输出,它的使用方式其实和cout时一样的,在本例中我们将其用于输出异常信息。当访问数组出现下标越界时,程序就抛出异常,然后会被catch程序块捕获并在程序块中输出异常信息。在本例中我们如果将程序中的所有cerr全都替换为clog或者将所有clog全都替换为cerr,程序的输出结果是不会变化的,从这点看这两者似乎是没什么差别,其实差别在是否经过缓冲区,不过本例是无法体现出差别的,因为在输出异常信息的同时,endl会带来一次清扫缓冲区动作,因此经不经过缓冲区是无法得以体现的。cerr和clog之间的细微差别,我们只要做到心中有数就可以了。
     
  • 相关阅读:
    Git 如何优雅地回退代码?
    如何让自己的技能变现?
    读了100本书,总结出读遍万卷书的 7 大方法
    08月10日总结
    08月09日总结
    08月08日总结
    08月06日总结
    08月04日总结
    08月03日总结
    剑指offer52 两个链表的第一个公共节点
  • 原文地址:https://www.cnblogs.com/yongpan/p/7988443.html
Copyright © 2020-2023  润新知