12. stdio.h
標准輸入輸出頭文件提供用於輸入和輸出的函數。
宏:
NULL
_IOFBF
_IOLBF
_IONBF
BUFSIZ
EOF
FOPEN_MAX
FILENAME_MAX
L_tmpnam
SEEK_CUR
SEEK_END
SEEK_SET
TMP_MAX
stderr
stdin
stdout
函數:
clearerr();
fclose();
feof();
ferror();
fflush();
fgetpos();
fopen();
fread();
freopen();
fseek();
fsetpos();
ftell();
fwrite();
remove();
rename();
rewind();
setbuf();
setvbuf();
tmpfile();
tmpnam();
fprintf();
fscanf();
printf();
scanf();
sprintf();
sscanf();
vfprintf();
vprintf();
vsprintf();
fgetc();
fgets();
fputc();
fputs();
getc();
getchar();
gets();
putc();
putchar();
puts();
ungetc();
perror();
變量:
typedef size_t
typedef FILE
typedef fpos_t
12.1. 變量和定義
size_t同無符號整型,表示sizeof的結果。
FILE用於存儲文件流信息的類型。
fpos_t用於存儲文件中的位置信息的類型。
NULL空指針常量值。
_IOFBF,_IOLBF, 和_IONBF 在setvbuf函數中使用。
BUFSIZ表示在setbuf函數中使用的buffer的大小的整型變量。
EOF是負整型變量,表示文件的末尾位置。
FOPEN_MAX同時最多可以打開的文件數。
FILENAME_MAX一個字符數組表示的文件名的最大長度。如果實現時希望盡量對文件名長度沒有限制,則這個值建議設置為最大值。
L_tmpnam由tmpnam函數創建的臨時文件的文件名最大長度。
SEEK_CUR,SEEK_END, 和SEEK_SET 用於函數 fseek。
TMP_MAX函數 tmpnam 能夠產生的唯一文件名的最大數。
stderr,stdin,和 stdout指向響應標准錯誤、標准輸入和標准輸出的 FILE類型的指針。
12.2. 流和文件
流促進了實現一個介於程序與IO設備之間的抽象層的方式。流允許在多樣的IO設備之間讀寫數據的操作。有兩種類型的流,分別是文本流和二進制流。
文本流是由行(line)組成的。每行有0或0個以上字符,並且由一個換行符標示一行的結束。數據的轉換發生在文本的輸出輸出中。文本流由可打印字符、制表符、換行符組成。空格不能在換行符之前出現,盡管這與具體的實現中讀取文本時是否移除空格有關。具體的實現至少要支持每行有254個字符(包括換行符)的情形。
二進制流輸入輸出是將數據以 1:1 比例傳輸的。沒有任何轉換存在,所有的字符都會被傳輸。
一個程序一旦啟動,就有標准輸入、標准輸出和標准錯誤三個可用流。
程序中所使用到的文件,必須先打開然後通過流進行操作。文件IO中所操作的點,由文件位置(file position)決定。當采用追加模式打開一個文件時,file position 指向文件尾,而其他方式打開時,則指向文件頭。file position 隨讀寫操作為變化,始終標示著下一次操作的位置。
關閉文件後,就不能對它進行任何操作了。從 main 函數退出時,所有被打開的文件都會被自動關閉。
12.3. 文件函數
12.3.1. clearerr
聲明:
void clearerr(FILE *stream);
清除流stream的文件尾指示器和錯誤指示器。在錯誤指示器被表示為有錯誤產生時,如果不調用clearerr 或者rewind函數,則任何流操作都會返回錯誤。
12.3.2. fclose
聲明:
int fclose(FILE *stream);
關閉流。所有的buffer都會被flush。如果關閉成功,則返回0,否則返回EOF。
12.3.3. feof
聲明:
int feof(FILE *stream);
檢查流stream是否到達文件尾。如果流到達文件尾,則返回非零值;如果流沒有到達文件尾,則返回零。(即返回非零表示到文件尾)
12.3.4. ferror
聲明:
int ferror(FILE *stream);
檢查錯誤指示器。如果有錯誤產生,則返回非零;如果錯誤指示器沒有被設置,則表明沒有錯誤,返回零。(即返回非零表示有錯誤)
12.3.5. fflush
聲明:
int fflush(FILE *stream);
Flush流 stream 的輸出 buffer。如果流是空指針,則所有輸出buffer 會被 flush。如果成功,返回零。錯誤則返回EOF。
12.3.6. fgetpos
聲明:
int fgetpos(FILE *stream, fpos_t *pos);
獲取到文件流的當前位置,將它寫到pos 中。如果成功,則返回0,如果錯誤則返回非零值,並且將錯誤碼存儲到變量errno中。
12.3.7. fopen
聲明:
FILE *fopen(const char *filename, const char *mode);
開啟一個由 filename 變量指定文件名的文件。打開的模式參數mode取值及含義如下:
r 讀取文本文件 w 寫入文本文件 (重置文件,或者創建文件) a 追加文本文件 (打開文件,或者創建文件,且為追加模式) rb 讀取二進制文件 wb 寫入二進制文件 (重置文件,或者創建文件) ab 追加二進制文件 (打開文件,或者創建文件,且為追加模式) r+ 讀取和寫入文本文件 w+ 讀取和寫入文本文件 (重置文件,或者創建文件) a+ 讀取和寫入文本文件 (打開文件,或者創建文件,且為追加模式) r+b或者 rb+ 讀取和寫入二進制文件 w+b或者 wb+ 讀取和寫入二進制文件 (重置文件,或者創建文件) a+b或者 ab+ 讀取和寫入二進制文件 (打開文件,或者創建文件,且為追加模式)如果用 r 模式打開了不存在的文件,則 open 失敗。
如果用 a 模式打開文件,則無論當前文件位置在哪裡,所有的寫入操作都會以追加模式進行。
如果用+ 更新模式打開文件,因為此模式既可以輸入,也可以輸出,所以在每次在輸入與輸出操作之間切換時,必須使用函數 fseek, fsetpos, rewind,或 fflush。
打開文件成功,則返回指向文件的指針(根據不同模式,指向不同的位置)。打開失敗,則返回空指針。
12.3.8. fread
聲明:
size_t fread(void *ptr, size_tsize, size_t nmemb, FILE *stream);
將數據從流 stream 讀取到 ptr 所指示的數組。讀取nmemb 個 size 大小的元素。所以,讀取的總字節數為 (size*nmemb)。成功則返回讀取的元素個數,錯誤或到達文件尾則返回目前成功讀取的元素數(可能為0)。
12.3.9. freopen
聲明:
FILE *freopen(const char *filename, const char *mode, FILE *stream);
用給定的 stream來打開一個新的文件(由 filename 指定文件名)。此前打開的文件會被關閉。如果關閉舊文件而出現錯誤,錯誤會被忽略。模式參數 mode 與函數 fopen 中描述的一樣。通常用來重新連接 stdin, stdout,或者 stderr。成功則返回指向文件流的指針,錯誤則返回空指針。
12.3.10. fseek
聲明:
int fseek(FILE *stream, long intoffset, int whence);
設置文件流的file position 為給定的偏移量參數 offset。參數 offset 的偏移起始點,是參數 whence 指定的位置。參數whence 的可選值有:
SEEK_SET 從文件頭開始搜索。 SEEK_CUR 從文件當前位置開始搜索。 SEEK_END 從文件尾開始搜索。在一個文本流中,參數 whence應該是 SEEK_SET,並且參數 offset 應該是0或者由ftell返回的一個值。
文件尾指示器被重置。錯誤指示器不被重置。
成功則返回0,錯誤則返回非零值。
12.3.11. fsetpos
聲明:
int fsetpos(FILE *stream, const fpos_t *pos);
設置流stream 的 file position為給定的 pos 。參數pos 是由函數 fgetpos給定的。文件尾指示器會被 clear 。成功則返回0。失敗則返回一個非零值,並且errno會被設置。
12.3.12. ftell
聲明:
long int ftell(FILE *stream);
返回文件流中當前的 file position。如果是一個二進制流,則值為從文件開始處到當前位置的字節數。如果是一個文本流,則值為 fseek函數使用的用來返回當前的文件位置的值。
成功則返回當前的 file position。錯誤則返回-1L,並且 errno被設置。
12.3.13. fwrite
聲明:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
將數據從ptr 指示的數組,寫入到流 stream 中。寫入 nmemb 個size 大小的元素。所以,總的寫入字節數為 (size*nmemb)。成功則返回寫入的元素個數。錯誤則返回成功寫入的元素個數(可能為0)。
12.3.14. remove
聲明:
int remove(const char *filename);
刪除文件(硬盤刪除),之後該文件無法在被訪問(解除到文件的連接)。如果當前文件是打開狀態,則結果由實現決定。成功則返回0。錯誤則返回非零值。
12.3.15. rename
聲明:
int rename(const char *old_filename, const char *new_filename);
將名為old_filename 文件,更名為 new_filename文件。如果由 new_filename 指定的文件名存在,則結果是由實現所確定的。成功則返回0。錯誤則返回一個非零值,並且仍可以通過舊文件名(old_filename)來訪問。
12.3.16. rewind
聲明:
void rewind(FILE *stream);
設置 file position為給定文件流的開始處。錯誤指示器和文件尾指示器會被重置。
12.3.17. setbuf
聲明:
void setbuf(FILE *stream, char *buffer);
定義流如何被緩沖(buffer)。這個函數要在打開流之後、任何操作還沒有進行之前被調用。輸入和輸出是全緩沖的(fully buffered)。默認值BUFSIZ是緩沖區的大小。參數 buffer 指向用作緩沖區的數組變量。如果 buffer 是一個空指針,則流被當做無緩沖的。
12.3.18. setvbuf
聲明:
int setvbuf(FILE *stream, char *buffer, int mode, size_tsize);
這個函數與 12.3.17 中的 setvbuf 函數功能相同,只是參數不同。參數mode 定義了流采取的緩沖方式,可以設置為如下值:
_IOFBF 輸入和輸出全緩沖(fully buffered)。如果緩沖區為空,一個輸入操作可以填充 buffer。On output the buffer will be completely filled至於輸出的情況,緩沖區在任何信息被寫入文件之前(或者流關閉)會被完全填滿. _IOLBF 輸入和輸出行緩沖(line buffered)。如果緩沖區為空,一個輸入操作可以填充 buffer。當向緩沖區寫入一個換行符時,緩沖區會被 flush。 _IONBF 輸入和輸出不緩沖(not buffered)。輸入和輸出都不緩沖。參數buffer 指向當做緩沖區的數組。如果 buffer 為空指針,則setvbuf調用 malloc創建一個它自己的 buffer。
參數size 是 buffer 所指定的數組的大小。
成功則返回0。錯誤則返回非零值。
12.3.19. tmpfile
聲明:
FILE *tmpfile(void);
以二進制更新模式(wb+)創建臨時文件。當程序結束或者流被關閉時,tempfile會被移除。
成功則返回指向文件流的FILE指針,錯誤則返回空。
12.3.20. tmpnam
聲明:
char *tmpnam(char *str);
產生並返回一個當前不存在的可用文件名。最多產生TMP_MAX個不同的文件名。
如果參數str 是空指針,則函數返回一個指向可用文件名的指針。如果參數 str 是一個指向字符數組的有效指針,則產生的文件名會被寫入到這個數組,並且返回指向這個數組的指針。文件名長度的字節數最多為L_tmpnam。
該系列譯文在持續更新中