C語言中的stdin,stdout,stderr[轉]


我們在寫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

1. #include<stdio.h>  

2.   

3. int main()  

4. {  

5.      printf("stdout Helo World!!\n");   

6.   

7.      return 0;  

8. }  

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

1. #include<stdio.h>  

2.   

3. int main()  

4. {  

5.      printf("Stdout Helo World!!\n");  

6.      fprintf(stdout,"Stdout Hello World!!\n");  

7.      perror("Stderr Hello World!!\n");  

8.      fprintf(stderr,"Stderr Hello World!!\n");  

9.        

10.      return 0;  

11. }  

編譯過后,./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),這樣就能達到實時輸出的效果。

 

 

 

 

 

 


免責聲明!

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



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