C 語言本身不包含任何輸入輸出語句,所有 I/O 操作均通過標準庫函數實現。這種設計體現了 C 語言「語言核心極小,功能靠庫擴展」的哲學。本文將建立 C 語言 I/O 系統的整體認知框架,梳理標準輸入輸出庫 <stdio.h> 的核心組件、文件流模型、以及後續學習路線圖。
stdin (標準輸入,預設鍵盤)stdout (標準輸出,預設顯示器)stderr (標準錯誤,預設顯示器,無緩衝)使用任何標準 I/O 函數,必須包含頭文件:
- #include <stdio.h> // 尖括號:系統頭文件搜索路徑
或
- #include "stdio.h" // 雙引號:先搜尋當前目錄,再搜系統路徑
stdio = Standard Input & Output。
為兼容早期代碼,C 標準允許 printf 和 scanf 在未包含 <stdio.h> 時隱式聲明。**但強烈建議始終顯式包含**,因為:
%lf 傳 float)fgets, fprintf, getchar 等)必須包含頭文件| 類別 | 代表函數 | 操作對象 | 特點 |
|---|---|---|---|
| 字符 I/O | getchar, putchar | stdin/stdout | 單字符,最基礎 |
fgetc, fputc | 任意 FILE* | 通用字符 I/O | |
getc, putc | 任意 FILE* | 可能為宏,效率略高 | |
| 行/字串 I/O | gets (已棄用), fgets | stdin/FILE* | 讀整行,含換行符 |
puts, fputs | stdout/FILE* | 寫字串,自動加換行(puts) | |
gets_s | stdin | C11 安全版本,需檢查返回值 | |
| 格式化 I/O | scanf, printf | stdin/stdout | 最常用,格式字串控制 |
fscanf, fprintf | 任意 FILE* | 文件格式化 I/O | |
sscanf, sprintf, snprintf | 字符串緩衝區 | 內存格式化,snprintf 安全 | |
| 二進制/塊 I/O | fread, fwrite | FILE* | 高效讀寫結構體/數組 |
fread/fwrite 返回值 | 成功項目數 | 需檢查是否等於請求數 | |
| 流控制 | fopen, fclose, fflush, rewind, fseek, ftell, feof, ferror, clearerr | FILE* | 文件打開/關閉/定位/狀態查詢 |
| 格式化輔助 | vprintf, vscanf, vsprintf 等 | va_list | 可變參數列表版本 |
| 模式 | 觸發刷新條件 | 典型流 |
|---|---|---|
| 全緩衝 | 緩衝區滿、調用 fflush、fclose、程式正常結束 | 磁盤文件 |
| 行緩衝 | 遇換行符 \n、緩衝區滿、輸入請求時(從關聯輸出流) | stdin, stdout (終端連接時) |
| 無緩衝 | 每次 I/O 立即執行 | stderr |