1. 程式人生 > >UNIX環境高階程式設計學習之路(三)----標準I/O庫

UNIX環境高階程式設計學習之路(三)----標準I/O庫

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp, int mode);
返回值:若流是寬定向的,返回 正值;若流是位元組定向的,返回負值;若流是未定向的,返回0;
</pre></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13px; line-height:19.5px"><span style="font-size:0.933rem">根據mode引數的不同值,fwide函式執行不同的工作。</span></span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13px; line-height:19.5px"><span style="font-size:0.933rem">* 若mode引數值為負,fwide將試圖使指定的流是位元組定向的。</span></span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13px; line-height:19.5px"><span style="font-size:0.933rem">* 若mode引數值為正,</span></span><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">fwide將試圖使指定的流是寬定向的。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">* 若mode引數為0,fwide將不試圖設定流的定向,但返回標識該流定向的值。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">    當開啟一個流時,標準I/O函式fopen返回一個指向FILE物件的指標,該物件通常是一個結構,它包含了標準I/O庫為管理該流所需要的所有資訊,包括用於實際I/O的檔案描述符、指向於該流緩衝區的指標、緩衝區的長度,當前在緩衝區中的位元組數以及出錯標誌等。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">應用程式沒有必要檢驗FILE物件,為了引用一個流,需要FILE指標作為引數傳遞給每個標準I/O函式,FILE * 為檔案指標。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px"></span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">三、標準輸入、標準輸出和標準錯誤</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">    這三個流可以自動的被程序使用,他們是:標準輸入、標準輸出和標準錯誤。這些流引用的檔案與檔案描述符STDIO_FILENO、STDOUT_FILENO、STDERR_FILENO所引用的相同。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">這3個標準I/O流通過預定義檔案指標stdio、stdout和stderr加以引用。</span></div><div style="margin:0px; font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px"></span></div><div style="margin:0px; widows:1"><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1"><span style="font-family:Verdana,Arial,Helvetica,sans-serif; font-size:13.995px; line-height:19.5px">四、緩衝</span></div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">    標準I/O庫提供緩衝的目的是儘可能的減少使用read和write呼叫次數。他也對每個I/O流自動的進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">標準I/O提供了一下三種類型的緩衝。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">(1)全緩衝。這種情況是在填滿標準I/O緩衝區後才進行實際的I/O操作。駐留在磁碟上的檔案通常是由標準I/O庫實施全緩衝的。在一個流上執行第一次I/O操作時,相關標準I/O函式通常呼叫malloc獲得需要使用的緩衝區。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">   術語沖洗(flush)說明標磚I/O緩衝區的寫操作。緩衝區可由標準I/O例程自動的沖洗(例如,當填滿一個緩衝區時,)或者可以呼叫函式fflush沖洗一個流。在標準I/O方面,flush(沖洗)意味著將緩衝區的內容寫到磁碟上,在終端驅動上面,flush(刷清)表示丟棄已經儲存在緩衝區的資料。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">(2)行緩衝。在輸入和輸出中遇到換行符時,標準I/O庫執行I/O操作。這允許我們一次輸出一個字元,但只有在寫了一行之後才進行實際I/O操作、當流涉及一個終端時,通常使用行緩衝。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">行緩衝限制:第一、標準I/O庫用來收集每一行的緩衝區的長度是固定的,所以,只要填滿了緩衝區即使還沒有一個換行符,也進行I/O操作。第二,任何時候只要通過標準I/O庫要求從(a)一個不帶緩衝的流,或者(b)一個行緩衝的流得到輸入資料,那麼就會沖洗所有行緩衝輸出流。一個不帶緩衝的流輸入需要從核心獲得資料。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">(3)不帶緩衝。標準I/O庫不對字元進行緩衝儲存。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">    標準錯誤流stderr通常是不帶緩衝的,這樣就可以讓出錯資訊儘可能快的顯示出來。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">*當且僅當標準輸入和標準輸出並不指定互動式裝置時,他們才是全緩衝的。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">*標準錯誤絕不會是全緩衝的。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">很多系統預設使用下列型別的緩衝:</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">* 標準錯誤是不帶緩衝的。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">* 若是指向終端裝置的流。則是行緩衝的;否則是全緩衝的。</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1">更改緩衝型別的函式</div><div style="font-family:Helvetica,'Hiragino Sans GB',微軟雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; margin:0px; widows:1"><pre name="code" class="cpp">#include <stdio.h>
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
返回值:成功返回0,出錯返回非0。