#define EOF (-1)
迄今為止,關於 EOF 作用的觀點各異。大多數程式設計師認為“檔案中有一個 EOF 字元,用於表示檔案的結尾”。但實際上,這個觀點並不正確(或者說並不完整),在檔案所包含的資料中,並沒有什麼檔案結束符。從 EOF 宏的定義中可以看出,EOF 宏的值為 -1,屬於 int 型別的資料,在 32 位系統中,可以表示為 0xFFFFFFFF。由此可見,EOF 並不是一個字元,也不是檔案中實際存在的內容。那麼,為什麼會有這樣的觀點存在呢?int main(void) { FILE *fp=NULL; int c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能夠存取該檔案.n"); exit(1); } while((c=fgetc(fp)) != EOF) { printf("%xn", c); } fclose(fp); fp=NULL; }對於 fgetc(或者 getc)函數,它返回一個 int 型別的資料。在正常情況下,fgetc(或者 getc)函數以 unsigned char 的方式讀取檔案流,並擴張為一個整數返回。換言之,fgetc(或 getc)函數從檔案流中讀取一個位元組,並加上 24 個 0,成為一個小於 256 的整數,然後返回。
char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能夠存取該檔案.n"); exit(1); } while((c=fgetc(fp)) != EOF) { printf("%xn", c); }因為文字檔案中儲存的是 ASCII 碼,而 ASCII 碼中 FF 代表空值(blank),所以如果讀檔案返回了 0xFF,也就說明已經到了文字檔案的結尾處。也就是說,在語句“while((c=fgetc(fp))!=EOF)”中,當讀取的字元為 0xFF 時,子語句“c=fgetc(fp)”中的“fgetc(fp)”的值由 0x000000FF 轉換為 char 型別(即 c 等於 0xFF);而在執行子語句“c!=EOF”時,字元與整數比較,c 被轉換為 0xFFFFFFFF,條件成立,遇到空格字元時就退出。由此可見,如果是二進位制檔案,其中可能會包含許多 0xFF,因此不能把讀到 EOF 作為檔案結束的條件,而此時只能使用 feof() 函數。
unsigned char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能夠存取該檔案.n"); exit(1); } while((c=fgetc(fp))!= EOF) { printf("%xn", c); }在上面的“while((c=fgetc(fp))!=EOF)”語句中,就算是語句“fgetc(fp)”返回的結果為 -1(即 0xFFFFFFFF),但通過語句“c=fgetc(fp)”對其強制轉換 unsigned char 型別,即 c 等於 0xFF。而在執行子語句“c!=EOF”時,c 被轉換成 0x000000FF,永遠也不可能等於 0xFFFFFFFF,因此表示式“c!=EOF”將永遠成立。