stdin,stdout,stderr
?
其實,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.?<pre?class="cpp"?name="code">#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:
[cpp]?view plain?copy?
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),這樣就能達到實時輸出的效果。
轉載于微信公眾號?嵌入式ARM
總結
以上是生活随笔為你收集整理的stdin,stdout,stderr的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppo 小米,vivo等手机获取roo
- 下一篇: 日期类Date