正確處理 EOF 與錯誤是健壯檔案 I/O 的關鍵。
int feof(FILE *stream);
feof(fp) 在讀取失敗後才為真,而非「下一筆將讀到 EOF」。
int ch;
while ((ch = fgetc(fp)) != EOF) { /* 直接檢查回傳值 */
putchar(ch);
}
/* 或 */
while (!feof(fp)) {
ch = fgetc(fp);
if (ch == EOF) break; /* 區分真 EOF 與讀取錯誤 */
putchar(ch);
}
int ferror(FILE *stream);
errno (含 ) 取得具體錯誤碼。
void clearerr(FILE *stream);
clearerr 重試。二進位檔中 EOF (通常 -1) 是合法位元組值 (0xFF)。單純檢查 ch == EOF 會誤判。必須用 feof(fp) 或檢查 fread 回傳值。
| 標頭檔 | 主要功能 | 現代 C 狀態 |
|---|---|---|
| 記憶體管理 (malloc/free 等) | 已併入 |
| 斷言巨集 assert() | 標準 |
| IBM PC ROM BIOS 中斷呼叫 | 平台專屬,已淘汰 |
| DOS 主控台 I/O (getch, clrscr 等) | 平台專屬,Windows 仍保留 |
| 字元分類/轉換 (isalpha, toupper 等) | 標準 |
| 目錄/路徑結構與函數 | POSIX |
| MS-DOS/8086 中斷與常數 | 平台專屬,已淘汰 |
| 錯誤碼巨集 (EDOM, ERANGE 等) | 標準 |
| 檔案控制選項 (open 旗標) | POSIX 標準 |
| 浮點特性常數 (FLT_MAX, DBL_EPSILON) | 標準 |
| BGI 圖形庫函數/常數 | Borland 專屬,已淘汰 |
| 低階 I/O (open, read, write, close) | POSIX |
| 整數型別範圍 (INT_MAX, CHAR_BIT) | 標準 |
| 數學函數 (sin, sqrt, pow 等) | 標準 |
| 記憶體操作 (memcpy, memset 等) | 已併入 |
| 進程控制 (spawn, exec 族) | POSIX |
| 非局部跳轉 (setjmp/longjmp) | 標準 |
| 檔案共享模式 | Windows 專屬 |
| 訊號處理 (signal, raise) | 標準 |
| 可變參數 (va_list, va_start 等) | 標準 |
| 通用型別/巨集 (size_t, NULL, offsetof) | 標準 |
| 標準 I/O (FILE, printf, fopen 等) | 標準 |
| 通用工具 (malloc, qsort, strtol 等) | 標準 |
| 字串/記憶體操作 (strcpy, memcpy 等) | 標準 |
| 檔案狀態 (stat, chmod, 模式常數) | POSIX 標準 |
| 系統資料型別 (pid_t, size_t, time_t) | POSIX 標準 |
| 時間結構 (timeval, timezone) | POSIX 標準 |
| 時間/日期函數 (time, localtime, strftime) | 標準 |
| 機器相關常數 (MAXINT, MAXFLOAT) | 已併入 / |
FILE* 為不透明控制結構,含緩衝區、位置指標、旗標。fopen,結束必須 fclose。b/t 指定二進位/文字。fseek/rewind) 實現隨機存取。feof/ferror 區分。