1. 介紹
在使用C語言進行程式設計時,檔案處理和標準輸入的操作非常重要。其中,EOF(End of File,檔案結尾)是一個用來表示檔案或輸入終點的特殊值。如果沒有正確理解EOF,可能無法正確處理檔案結尾,導致程式出現非預期的行為。本文將詳細說明EOF的定義、用法,以及相關處理時應注意的事項。
2. EOF的定義與角色
EOF(End of File,檔案結尾)是在C語言中用來標示檔案結束或錯誤的一個特殊值,定義於標準函式庫stdio.h
。具體來說,EOF的數值為-1
。在進行檔案或輸入處理時,可以利用EOF來判斷資料是否已經全部讀取完畢。
例如,getchar()
或fgetc()
等函式在讀到檔案結尾時會回傳EOF。如此一來,程式便能辨識資料結束點,並進行適當的處理。
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
int c;
while ((c = fgetc(file)) != EOF) {
putchar(c);
}
fclose(file);
return 0;
}
這段程式碼會逐字讀取並輸出檔案內容,直到遇到EOF為止。
3. EOF的使用範例:getchar() 與 feof()
EOF經常與getchar()
、fgetc()
等輸入函式搭配使用。以下舉例說明如何使用getchar()
來偵測EOF:
#include <stdio.h>
int main() {
int c;
// 從標準輸入取得字元,直到輸入EOF為止
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
這個程式會從標準輸入讀取字元並逐一輸出,直到輸入EOF為止。在鍵盤操作上,通常在Linux或macOS下使用Ctrl + D
,在Windows則使用Ctrl + Z
來輸入EOF。
另外,也可使用feof()
函式來判斷是否已達檔案結尾。此函式會檢查檔案結尾,並回傳真(1)或假(0)。
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
if (file == NULL) {
perror("無法開啟檔案");
return 1;
}
int c;
while ((c = fgetc(file)) != EOF) {
putchar(c);
}
if (feof(file)) {
printf("n已達檔案結尾。n");
}
fclose(file);
return 0;
}
這段程式會在到達EOF後利用feof()
判斷檔案是否完整讀取。
4. 使用EOF時的注意事項
處理EOF時需注意char
型態與int
型態的差異。由於getchar()
和fgetc()
回傳的EOF是-1
,因此這些函式的回傳值型態為int
。若將回傳值存入char
型態變數,可能會因符號判斷錯誤導致無法正確處理EOF。
例如,若將EOF存入char
型態,EOF可能會被轉換為0xFF
,導致檔案結尾無法正確判斷並出現非預期行為。
因此,建議在處理EOF時,應以int
型態變數來接收回傳值。以下是使用int
型態正確判斷EOF的範例:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
此程式會用int
型態接收回傳值,以正確判斷EOF。

5. EOF的進階應用範例
以下舉例說明如何利用EOF來計算檔案的行數。此程式會在遇到EOF前,逐字讀取檔案內容並在偵測到換行字元時累加行數。
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
int c;
int line_count = 0;
if (file == NULL) {
perror("無法開啟檔案");
return 1;
}
while ((c = fgetc(file)) != EOF) {
if (c == 'n') {
line_count++;
}
}
printf("行數: %dn", line_count);
fclose(file);
return 0;
}
這個範例會計算檔案中換行的次數,最終輸出行數。這是運用EOF偵測檔案結尾並完成處理的典型應用。
6. 小結
EOF在C語言中,對於偵測檔案或標準輸入結尾有重要作用。正確運用EOF能讓檔案與輸入處理的程式更加穩定。特別要注意,應以int
型態來判斷EOF,而非char
型態,以確保判斷的正確性。
本文自EOF的基本定義到具體範例及應用做了全面說明,歡迎在使用C語言進行檔案處理時參考。