stdio.h 定義了標準輸入輸出流操作的完整接口:文件流操作、格式化輸入輸出、字符/行讀寫、臨時文件、錯誤處理。本文系統整理宏常量、類型定義、函數原型分類、流與文件模型、核心文件函數語義,構建權威速查手冊 (上篇覆蓋文件操作函數)。
| 宏 | 含義 |
|---|---|
| NULL | 空指針常量 |
| _IOFBF, _IOLBF, _IONBF | setvbuf 緩衝模式:全緩衝/行緩衝/無緩衝 |
| BUFSIZ | 默認緩衝區大小 (setbuf 使用) |
| EOF | 文件結束/錯誤標志 (負整數,通常 -1) |
| FOPEN_MAX | 同時打開最大文件數 |
| FILENAME_MAX | 文件名最大長度 |
| L_tmpnam | tmpnam 生成臨時文件名最大長度 |
| SEEK_SET, SEEK_CUR, SEEK_END | fseek 定位基準:文件頭/當前/文件尾 |
| TMP_MAX | tmpnam 最大唯一文件名數 |
| stderr, stdin, stdout | 標準錯誤/輸入/輸出流指針 (FILE*) |
size_t:無符號整數,sizeof 結果類型。FILE:文件流信息不透明結構體 (內含緩衝區、指針、標志、文件描述符)。fpos_t:文件位置記錄類型 (支持大文件,配合 fgetpos/fsetpos)。\n 結尾,可能轉換 \r\n↔\n (Windows),至少支持 254 字符/行。程序啟動自動打開:stdin (輸入)、stdout (輸出)、stderr (錯誤)。
打開文件建立流,file position 決定下次讀寫位置。r/r+` 位於頭,a/a+` 位於尾。關閉流斷開連接,main 返回自動關閉所有流。
clearerr(FILE *stream)清除流的 EOF 標志和錯誤標志。錯誤標志置位後,必須調用此函數或 rewind 才能恢復操作。
fclose(FILE *stream)刷新緩衝區、關閉流、釋放資源。成功返回 0,失敗返回 EOF。
feof(FILE *stream)檢查 EOF 標志。到達文件尾返回非 0,否則 0。
ferror(FILE *stream)檢查錯誤標志。有錯誤返回非 0,否則 0。
fflush(FILE *stream)刷新輸出緩衝區。stream=NULL 刷新所有輸出流。成功 0,失敗 EOF。
fgetpos(FILE *stream, fpos_t *pos)獲取當前文件位置存入 pos。成功 0,失敗非 0 並置 errno。
fopen(const char *filename, const char *mode)打開文件。模式表見前文 (r/w/a/r+/w+/a+ 及 b 變體)。成功返回 FILE*,失敗 NULL。+ 模式讀寫切換需 fseek/fsetpos/rewind/fflush 同步。
fread(void *ptr, size_t size, size_t nmemb, FILE *stream)讀取 nmemb 項,每項 size 字節。返回實際讀取項數 (短計數表示 EOF/錯誤)。
freopen(const char *filename, const char *mode, FILE *stream)用新文件關聯現有流 (關閉舊文件)。常用於重定向 stdin/stdout/stderr。成功返回流指針,失敗 NULL。
fseek(FILE *stream, long offset, int whence)設置文件位置。whence:SEEK_SET/CUR/END。文本流限 SEEK_SET + 0 或 ftell 值。成功 0,失敗非 0。清除 EOF 標志。
fsetpos(FILE *stream, const fpos_t *pos)按 fgetpos 獲取的位置設置。清除 EOF 標志。成功 0,失敗非 0 置 errno。
ftell(FILE *stream)返回當前文件位置。二進制流為字節偏移,文本流為魔術值。成功返回位置,失敗 -1L 置 errno。
fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)寫入 nmemb 項。返回實際寫入項數 (短計數表示錯誤)。
remove(const char *filename)刪除文件 (解除鏈接)。打開狀態下行為實現定義。成功 0,失敗非 0。
rename(const char *old, const char *new)重命名。new` 存在時行為實現定義。成功 0,失敗非 0。
rewind(FILE *stream)等價 fseek(stream, 0, SEEK_SET) + clearerr(stream)。
setbuf(FILE *stream, char *buffer)設置緩衝區。buffer=NULL` 無緩衝,否則全緩衝 (大小 BUFSIZ)。必在操作前調用。
setvbuf(FILE *stream, char *buffer, int mode, size_t size)精確控制緩衝:_IOFBF` 全緩衝、_IOLBF` 行緩衝、_IONBF` 無緩衝。buffer=NULL` 自動 malloc。成功 0,失敗非 0。
tmpfile(void)創建二進制更新模式 (wb+`) 臨時文件。關閉/程序結束自動刪除。成功返回 FILE*,失敗 NULL。
tmpnam(char *str)生成唯一臨時文件名。str=NULL` 返回靜態緩衝區指針,否則寫入 str (長度 L_tmpnam)。最多 TMP_MAX 次。
stdio.h 提供了分層抽象:流 (FILE*) 統一設備差異、緩衝策略平衡性能、文本/二進制模式適配平台、位置控制支持隨機訪問。掌握上述 20 個文件函數語義、返回值約定、錯誤處理模式,是 C 語言文件編程的必修課。下篇將覆蓋格式化輸入輸出 (printf/scanf 族) 與字符/行讀寫函數。