C語言中的stdin,stdout,stderr

2021-08-20 06:20:28 字數 1576 閱讀 2962

我們在寫c程式時經常遇到printf(),fprintf(),perror(),這些東西到底有什麼作用。說到這不得不提及stdin,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有什麼區別和作用呢?

我們在寫程式時用printf()是為了我們能監控我們的程式執行狀況,或者是說debug,如果我們的程式是一直執行,不停下來,我們不可能時刻盯著螢幕去看程式輸出,這時我們就可以用檔案重定向。將輸出到一檔案中,我們以後就可以看這檔案就行。舉個例子,test.c

[cpp] view plain copy 

1.#include

2.   

3. int main()  

4.   

編譯過後,我們./test > test.txt(預設是將stdout裡的內容重定向到檔案中),這樣就把test程式輸出的內容輸出到test.txt檔案中。還有一種更明晰的寫法./test  1>test.txt,這裡的1就代表stdout。說到這你應該知道stderr該怎樣處理了。再舉個例子test.c:

[cpp] view plain copy 

1. #include

2.   

3. int main()  

4.   

編譯過後,./test,螢幕上是四條輸出,如果./test > test.ext ,結果是螢幕上輸出兩條stderr hello world!!,stdout helo world!!在檔案test.txt中,基於上面說的很容易理解現在的結果,於是我們可以隨便處理我們想要的輸出,例如:

./test 1>testout.txt 2>testerr.txt,我們將stdout輸出到檔案testout.txt中,將stderr輸出到testerr.txt檔案中;

./test 1>testout.txt ,將stdout輸出到檔案testout.txt 中,stderr輸出到螢幕上;

./test 2>testerr.txt,將stderr輸出到檔案testerr.txt中,stdout輸出到螢幕上;

./test > test.txt 2>&1,這是將stdout和stderr重定向到同一檔案test.txt檔案中。

如果我們不想看到輸出內容,既不想在螢幕上看見,也不想重定向到檔案中,別擔心,萬能的linux有解決辦法,./test > /dev/zero 2>&1,這樣就看不到任何輸出了。

note:stderr,和stdout還有重要一點區別,stderr是沒有緩衝的,它立即輸出,而stdout預設是行緩衝,也就是它遇到『\n』,才向外輸出內容,如果你想stdout也實時輸出內容,那就在輸出語句後加上fflush(stdout),這樣就能達到實時輸出的效果。

C語言中的 ,

c語言中的 今天在分析乙份原始碼的時候遇到了如下 define uf call x report file line x,x static int report char file,int line,char call,int irc return irc 網上參考 cpp view plain c...

C語言中的

c語言中的 今天在分析乙份原始碼的時候遇到了如下 覺得其中的 很有意思,於是就將這個知識點整理一下。和 都是預處理指令,我們先看 用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 ...

C語言中的 ,

用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 sqr 8 則輸出為 the square of x is 64.注意到沒有,引號中的字元x被當作普通文本來處理,而不是被當作乙個...