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

C語言 EOF 詳解:定義、值、判斷模式與跨平台差異

     編輯:C 語言問答

定義與值

  • 全稱: End Of File。
  • 定義位置: `` 中 `#define EOF (-1)` (通常為 -1,標準要求為負整數常量表達式)。
  • 類型: `int` (非 `char`),以便容納所有 `unsigned char` 值 (0-255) 加上 EOF。

標準判斷模式

int c;
while ((c = getchar()) != EOF) {
    putchar(c);
}
// 或
while ((c = fgetc(fp)) != EOF) { ... }
// 或
while (fgets(buf, sizeof(buf), fp) != NULL) { ... } // fgets 遇 EOF 返回 NULL

為什麼不用 char 接收?

// 錯誤示範
char c;
while ((c = getchar()) != EOF) { ... } // 若 char 為 unsigned (0-255),永不等於 -1 → 無限迴圈
// 正確:int c;

跨平台行尾與 EOF 觸發方式

平台文字檔行尾終端觸發 EOF二進制檔 EOF
Linux/macOSLF (\n, 0x0A)Ctrl+D讀取到檔案末尾
WindowsCRLF (\r\n, 0x0D 0x0A)Ctrl+Z (行首) + Enter讀取到檔案末尾

進階:feof() vs 返回值判斷

  • `feof(fp)` 僅在嘗試讀取並失敗後才置位,不可用於迴圈條件預判。
  • 正確模式:`while (fread(buf, 1, sizeof(buf), fp) > 0) { ... }`,檢查返回值。
  • 錯誤模式:`while (!feof(fp)) { fread(...); }` 會多執行一次迴圈處理殘留資料。

網路流/管道的 EOF

對 `socket`、`pipe`、`FIFO`,EOF 表示對端關閉寫入端 (`shutdown(fd, SHUT_WR)` 或 `close(fd)` 且無其他寫入端引用)。非阻塞模式下 `read` 返回 -1 且 `errno == EAGAIN/EWOULDBLOCK` 非 EOF。

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