前面介紹的《檔案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進階環境程式設計》