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

C 語言檔案操作教程(十):檔案狀態檢測 feof/ferror/clearerr 與 C 標準庫標頭檔完整分類

     編輯:C 語言基礎

檔案狀態三大檢測函數

正確處理 EOF 與錯誤是健壯檔案 I/O 的關鍵。

1. feof — 檢測檔案結尾旗標


int feof(FILE *stream);
  • 回傳非 0:上一次讀取嘗試已越過檔案結尾 (旗標已設定)。
  • 回傳 0:未到結尾。
  • 關鍵誤區: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);
}

2. ferror — 檢測讀寫錯誤旗標


int ferror(FILE *stream);
  • 回傳非 0:發生 I/O 錯誤 (磁碟故障、權限、裝置移除等)。
  • 回傳 0:無錯誤。
  • 需配合 errno (含 ) 取得具體錯誤碼。

3. clearerr — 清除旗標


void clearerr(FILE *stream);
  • 將 EOF 旗標與錯誤旗標同時清零。
  • 罕見用法:某些裝置驅動程式在錯誤後需 clearerr 重試。

二進位檔判斷 EOF 的特殊性

二進位檔中 EOF (通常 -1) 是合法位元組值 (0xFF)。單純檢查 ch == EOF 會誤判。必須用 feof(fp) 或檢查 fread 回傳值。

C 標準庫標頭檔完整分類 (Turbo C 2.0 / ANSI C89 擴展)

標頭檔主要功能現代 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)已併入 /

本章小結:檔案操作核心觀念

  1. C 將裝置視為位元組串流,統一介面。
  2. 檔案分文字 (含轉換) 與二進位 (原貌)。
  3. FILE* 為不透明控制結構,含緩衝區、位置指標、旗標。
  4. 操作前必須 fopen,結束必須 fclose。
  5. 四種開檔模式:唯讀、唯寫、讀寫、附加;搭配 b/t 指定二進位/文字。
  6. 讀寫單位:字元、字串、資料塊、格式化。
  7. 位置指標可移動 (fseek/rewind) 實現隨機存取。
  8. EOF 與錯誤旗標分離,需用 feof/ferror 區分。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved