天天看點

《unix進階環境程式設計》标準I/O——FILE對象

       前面介紹的《檔案I/O》都是針對檔案描述符進行操作的,并且是非緩沖區方式的。本節記錄的标準I/O的操作是在流進行的,當用标準I/O打開或建立一個檔案時,已使一個流與一個檔案相關聯。

       标準I/O檔案的流可用與單位元組或多位元組(寬)字元集。流的定向決定所讀、寫的字元是單位元組還是多位元組。流最初被建立時,并沒有定向,若在未定向的流上使用一個多位元組I/O函數,則将該流的定向設定為寬定向,若是使用一個單位元組I/O函數,則将該流的定向設定為位元組定向。隻有兩個函數可以改變流的定向:freopen函數清除一個流的定向;fwide函數設定流的定向。

/***********
 * 設定流的定向
 * 傳回值:
 *  1、若流是寬定向則傳回正值;
 *  2、若流是位元組定向則傳回負值;
 *  3、若流是未定向則傳回0;
 * 函數原型:
 * #include <stdio.h>
 * #include <wchar.h>
 * int fwide(FILE *fp, int mode);
 * 說明:根據mode的不同值,fwide操作不同:
 *  1、mode為負值,fwide試圖使指定的流是位元組定向;
 *  2、mode為正值,fwide試圖使指定的流是寬定向;
 *  3、mode值為0,fwide不設定流的定向,傳回辨別該流定向的值;
 * 注意:fwide并不改變已定向流的定向
 * *************/
           

标準輸入、輸出和出錯

/************
 * 标準輸入     stdin
 * 标準輸出     stdout
 * 标準出錯     stderr
 * ***********/
           

緩沖區

/**************
 * 緩沖:目的是減少資料的讀寫次數;
 * 标準I/O的緩沖類型:
 *  1、全緩沖:填滿标準I/O緩沖區之後才進行實際I/O操作;
 *  2、行緩沖:擋在輸入和輸出中遇到換行符,則執行I/O操作;
 *  3、不帶緩沖:标準I/O庫不對字元進行緩沖存儲;
 *
 * 函數功能:更改緩沖區類型
 * 傳回值:若成功則傳回0,若出錯則傳回非0;
 * 函數原型:
 * #include <stdio.h>
 * void setbuf(FILE *fp, char *buf);
 * int setvbuf(FILE *fp,char *buf, int mode, ssize_t size);
 * 注意:使用這兩個函數必須确定fp流已經打開。
 *
 * setbuf函數打開或關閉緩沖機制,參數buf指定一個長度為BUFSIZE的緩沖區。
 * sevbuf函數根據參數mode指定緩沖類型:
 * mode參數:
 *      _IOFBF  全緩沖
 *      _IOLBF  行緩沖
 *      _IONBF  不帶緩沖
 *____________________________________________________________
 |函數   | mode   | buf    | 緩沖區及長度       | 緩沖類型    |
 |_______|________|________|____________________|_____________|
 |setbuf |        | 非空   | 長度BUFSIZE的buf   | 全或行緩沖  |
 |       |        | NULL   | 無緩沖區           | 不帶緩沖區  |
 |_______|________|________|____________________|_____________|
 |setvbuf| _IOFBF | 非空   | 長度size的buf      | 全緩沖      |
 |       |        | NULL   | 合适長度緩沖區     |             |
 |       | _IOLBF | 非空   | 長度size的buf      | 行緩沖      |
 |       |        | NULL   | 合适長度的緩沖區   |             |
 |       | _IONBF | 忽略   | 無緩沖區           | 不帶緩沖區  |
 |_______|________|________|____________________|_____________|
 ********/
           

參考資料

《unix進階環境程式設計》

繼續閱讀