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之間的細微差別,我們只要做到心中有數就可以了。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM