首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C標準庫參考指南(12):stdio.h 完整函數、宏、類型速查手冊 (上)

     編輯:關於C語言

前言:stdio.h——C 語言輸入輸出的基石

stdio.h 定義了標準輸入輸出流操作的完整接口:文件流操作、格式化輸入輸出、字符/行讀寫、臨時文件、錯誤處理。本文系統整理宏常量、類型定義、函數原型分類、流與文件模型、核心文件函數語義,構建權威速查手冊 (上篇覆蓋文件操作函數)。

一、 宏常量速查表

宏含義
NULL空指針常量
_IOFBF, _IOLBF, _IONBFsetvbuf 緩衝模式:全緩衝/行緩衝/無緩衝
BUFSIZ默認緩衝區大小 (setbuf 使用)
EOF文件結束/錯誤標志 (負整數,通常 -1)
FOPEN_MAX同時打開最大文件數
FILENAME_MAX文件名最大長度
L_tmpnamtmpnam 生成臨時文件名最大長度
SEEK_SET, SEEK_CUR, SEEK_ENDfseek 定位基準:文件頭/當前/文件尾
TMP_MAXtmpnam 最大唯一文件名數
stderr, stdin, stdout標準錯誤/輸入/輸出流指針 (FILE*)

二、 核心類型定義

  • size_t:無符號整數,sizeof 結果類型。
  • FILE:文件流信息不透明結構體 (內含緩衝區、指針、標志、文件描述符)。
  • fpos_t:文件位置記錄類型 (支持大文件,配合 fgetpos/fsetpos)。

三、 流與文件模型

1. 兩類流

  • 文本流:行序列,換行符 \n 結尾,可能轉換 \r\n↔\n (Windows),至少支持 254 字符/行。
  • 二進制流:字節 1:1 傳輸,無轉換,所有字符值保留。

2. 三大標準流

程序啟動自動打開:stdin (輸入)、stdout (輸出)、stderr (錯誤)。

3. 文件位置

打開文件建立流,file position 決定下次讀寫位置。r/r+` 位於頭,a/a+` 位於尾。關閉流斷開連接,main 返回自動關閉所有流。

四、 文件操作函數完整語義手冊 (上篇)

1. clearerr(FILE *stream)

清除流的 EOF 標志和錯誤標志。錯誤標志置位後,必須調用此函數或 rewind 才能恢復操作。

2. fclose(FILE *stream)

刷新緩衝區、關閉流、釋放資源。成功返回 0,失敗返回 EOF。

3. feof(FILE *stream)

檢查 EOF 標志。到達文件尾返回非 0,否則 0。

4. ferror(FILE *stream)

檢查錯誤標志。有錯誤返回非 0,否則 0。

5. fflush(FILE *stream)

刷新輸出緩衝區。stream=NULL 刷新所有輸出流。成功 0,失敗 EOF。

6. fgetpos(FILE *stream, fpos_t *pos)

獲取當前文件位置存入 pos。成功 0,失敗非 0 並置 errno。

7. fopen(const char *filename, const char *mode)

打開文件。模式表見前文 (r/w/a/r+/w+/a+ 及 b 變體)。成功返回 FILE*,失敗 NULL。+ 模式讀寫切換需 fseek/fsetpos/rewind/fflush 同步。

8. fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

讀取 nmemb 項,每項 size 字節。返回實際讀取項數 (短計數表示 EOF/錯誤)。

9. freopen(const char *filename, const char *mode, FILE *stream)

用新文件關聯現有流 (關閉舊文件)。常用於重定向 stdin/stdout/stderr。成功返回流指針,失敗 NULL。

10. fseek(FILE *stream, long offset, int whence)

設置文件位置。whence:SEEK_SET/CUR/END。文本流限 SEEK_SET + 0 或 ftell 值。成功 0,失敗非 0。清除 EOF 標志。

11. fsetpos(FILE *stream, const fpos_t *pos)

按 fgetpos 獲取的位置設置。清除 EOF 標志。成功 0,失敗非 0 置 errno。

12. ftell(FILE *stream)

返回當前文件位置。二進制流為字節偏移,文本流為魔術值。成功返回位置,失敗 -1L 置 errno。

13. fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

寫入 nmemb 項。返回實際寫入項數 (短計數表示錯誤)。

14. remove(const char *filename)

刪除文件 (解除鏈接)。打開狀態下行為實現定義。成功 0,失敗非 0。

15. rename(const char *old, const char *new)

重命名。new` 存在時行為實現定義。成功 0,失敗非 0。

16. rewind(FILE *stream)

等價 fseek(stream, 0, SEEK_SET) + clearerr(stream)。

17. setbuf(FILE *stream, char *buffer)

設置緩衝區。buffer=NULL` 無緩衝,否則全緩衝 (大小 BUFSIZ)。必在操作前調用。

18. setvbuf(FILE *stream, char *buffer, int mode, size_t size)

精確控制緩衝:_IOFBF` 全緩衝、_IOLBF` 行緩衝、_IONBF` 無緩衝。buffer=NULL` 自動 malloc。成功 0,失敗非 0。

19. tmpfile(void)

創建二進制更新模式 (wb+`) 臨時文件。關閉/程序結束自動刪除。成功返回 FILE*,失敗 NULL。

20. tmpnam(char *str)

生成唯一臨時文件名。str=NULL` 返回靜態緩衝區指針,否則寫入 str (長度 L_tmpnam)。最多 TMP_MAX 次。

五、 總結

stdio.h 提供了分層抽象:流 (FILE*) 統一設備差異、緩衝策略平衡性能、文本/二進制模式適配平台、位置控制支持隨機訪問。掌握上述 20 個文件函數語義、返回值約定、錯誤處理模式,是 C 語言文件編程的必修課。下篇將覆蓋格式化輸入輸出 (printf/scanf 族) 與字符/行讀寫函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved