天天看點

stderr stdout stdin的差別

stderr stdout stdin的差別

stdin --标準輸入

stdout – 标準輸出裝置 (printf(“…”)) 同 stdout。

stderr – 标準錯誤輸出裝置 兩者預設向螢幕輸出。

但如果用轉向标準輸出到磁盤檔案,則可看出兩者差別。stdout輸出到磁盤檔案,stderr在螢幕。

我們在用C去寫檔案時的操作,File *fp=fopen(),這個fp就是我們向系統申請的,相當于一通往檔案的通道。

其實,stdin,stdout,stderr就是這個fp,不過他是随着計算機系統的開啟預設打開的,其中0就是stdin,表示輸入流,指從鍵盤輸入,1代表stdout,2代表stderr,1,2預設是顯示器。printf()其實就是向stdout中輸出,等同于fprintf(stdout,“****”),perror()其實就是向stderr中輸出,相當于fprintf(stderr,“**”),那到底stdout,和stderr有什麼差別和作用呢?這是c中的宏定義。

#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

           

那麼stdout和stderr到底有什麼差別呢,請看下面的代碼

#include "stdio.h"
int main()
{
	fprintf(stdout, "hello");  
	fprintf(stderr, "world!");
	return 0;
}

           

你們猜猜會輸出什麼呢

world!hello

是不是很奇怪為什麼不是helloworld!

因為stdout是帶行緩沖的 他的輸出會放到一個buffer(緩沖區1) 裡面 隻有到換行時才會輸出到螢幕上的 而stderr 是無緩沖的 會直接輸出到螢幕上,因為我們的hello沒有加換行符,是以雖然他在前面但他也隻憋着,等到換行時才輸出。

其實我在windos下用了vs2017和devc++兩個編譯器輸出的都是helloworld!隻有在Linux下輸出的才是world!hello,可能在windos下stdout不帶行緩沖的吧。

為什麼要引入緩沖區

比如我們從磁盤裡取資訊,我們先把讀出的資料放在緩沖區,計算機再直接從緩沖區中取資料,等緩沖區的資料取完後再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩沖區的操作大大快于對磁盤的操作,故應用緩沖區可大大提高計算機的運作速度。

又比如,我們使用列印機列印文檔,由于列印機的列印速度相對較慢,我們先把文檔輸出到列印機相應的緩沖區,列印機再自行逐漸列印,這時我們的CPU可以處理别的事情。

現在您基本明白了吧,緩沖區就是一塊記憶體區,它用在輸入輸出裝置和CPU之間,用來緩存資料。它使得低速的輸入輸出裝置和高速的CPU能夠協調工作,避免低速的輸入輸出裝置占用CPU,解放出CPU,使其能夠高效率工作。

  • 緩沖區的類型 緩沖區 分為三種類型:

    全緩沖、行緩沖和不帶緩沖。

  • 全緩沖

    在這種情況下,當填滿标準I/O緩存後才進行實際I/O操作。全緩沖的典型代表是對磁盤檔案的讀寫。

  • 行緩沖

    在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字元先存放在緩沖區,等按下Enter鍵換行時才進行實際的I/O操作。典型代表是标準輸入(stdin)和标準輸出(stdout)。

  • 不帶緩沖

    也就是不進行緩沖,标準出錯情況stderr是典型代表,這使得出錯資訊可以直接盡快地顯示出來。

ANSI C( C89 )要求緩存具有下列特征:

  1. 當且僅當标準輸入和标準輸出并不涉及互動裝置時,它們才是全緩存的。
  2. 标準出錯決不會是全緩存的。但是,這并沒有告訴我們如果标準輸入和輸出涉及互動作用裝置時,它們是不帶緩存的還是行緩存的,以及标準輸出是不帶緩存的,還是行緩存的。

大部分系統預設使用下列類型的緩存:

  1. 标準出錯是不帶緩存的。
  2. 如果是涉及終端裝置的流,則它們是行緩存的;否則是全緩存的。
  3. 我們經常要用到标準輸入輸出流,而ANSI C對stdin、stdout和stderr的緩存特征沒有強行的規定,以至于不同的系統可能有不同的stdin、stdout和stderr的緩存特征。目前主要的緩存特征是:stdin和stdout是行緩存;而stderr是無緩存的。
  1. 緩沖區又稱為緩存,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的資料,這部分預留的空間就叫做緩沖區。 ↩︎