C stderr stdout 重定向到檔案

2021-09-02 11:31:53 字數 1851 閱讀 4678

通常,stderr和stdout被用來輸出內容顯示到螢幕,但是,有時候我們需要把這些資訊寫到指定的檔案,方便隨時查閱。最簡單的實現方式就是,把 stderr/stdout 的輸出

重定向到檔案。

這裡以stderr**說明。

#include #include int main( void )

// windwos下讀取檔案 freopen.out

system( "type freopen.out" );

getchar();

return 0;

}

執行結果如下,

stdout(標準輸出),輸出方式是行緩衝。輸出的字元會先存放在緩衝區,等按下回車鍵時才進行實際的i/o操作。

stderr(標準出錯),是不帶緩衝的,這使得出錯資訊可以直接盡快地顯示出來。

型別說明

輸出情況

滿緩衝i/o操作只有在緩衝區被填滿之後才會進行

1.緩衝區滿

2.刷出資料 (fflush)

3.關閉檔案(fclose)

行緩衝通常只有遇到換行符時,才會執行實際的i/o操作;但緩衝區滿也會強制執行

1.遇到換行符

2.緩衝區滿

3.刷出資料 (fflush)

4.關閉檔案(fclose)

無緩衝不快取,直接進行i/o操作

直接輸出

然而就緩衝來說,stdout與stderr沒有絕對的區別,因為緩衝型別可以設定。這裡要借助setvbuf() 或 setbuf() 函式。

#include #include int main( void )  

; setbuf(stderr, buf);

fprintf(stderr, "it is error 1\n");

printf("echo 1\n");

fprintf(stderr, "it is error 2\n");

printf("echo 2\n");

fprintf(stderr, "it is error 3\n");

fflush(stderr);

getchar();

return 0;

}

執行結果如下:

這樣,我們就可以定義緩衝區大小。緩衝區預設大小由 stdio.h 標頭檔案中的巨集 bufsiz 定義,是512位元組。另外,查閱一些資料說最小不能低於256位元組,但測試例子沒有這個問題(暫時沒有深究)。

setvbuf() 函式原型如下:

int setvbuf ( file * stream, char * buffer, int mode, size_t size );
setbuf() 可以當作是呼叫setvbuf(stream, buf, buf ? _iofbf : _ionbf, bufsize);

其中, mode是宣告緩衝的型別,如下幾個:

_iofbf

滿緩衝_iolbf

行緩衝_ionbf

無緩衝 size是緩衝區大小,單位位元組。

/* setvbuf example */

#include int main ()

參考:

stdin,stdout,stderr和重定向

c程式自動開啟3個檔案,標準輸入,標準輸出和標準錯誤輸出。預設情況下分別指向鍵盤,顯示器,顯示器。這裡的檔案指的是指向file的指標。file是stdio.h中定義的一種派生型別。file型別指標,指向乙個關於檔案資訊的資料報,其中包括檔案i o使用的緩衝區的資訊。stdin,stdout,stde...

Linux Linux printf 輸出重定向

方法一 include include include include include intmain 方法二 include include include intmain 到這裡我們就可以輕鬆解決 prinft 不輸出到螢幕的問題了.不外乎兩種情況.第1 標準輸出被重定向了.第2 輸出緩衝區的問...

Linux Linux printf 輸出重定向

方法一 include include include include include intmain 方法二 include include include intmain 到這裡我們就可以輕鬆解決 prinft 不輸出到螢幕的問題了.不外乎兩種情況.第1 標準輸出被重定向了.第2 輸出緩衝區的問...