VC 中定義:#define EOF (-1)。它只是整型常量 -1,文件末尾並不存在此標誌。
char ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c\n", ch);
}
問題:fgetc 返回 int,將 0xFF 讀取時擴展為 0x000000FF(正數),賦給 char 截斷為 0xFF(有號視為 -1),誤判為 EOF。
unsigned charint 返回(高位補 0)int ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c\n", ch);
}
ch = 0x000000FA(正數)ch = 0x000000FF(正數,不誤判)ch = 0xFFFFFFFF(-1,正確判斷)#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
_flag 中 EOF 標誌位while (feof(fp) == 0) {
ch = fgetc(fp);
printf("%0X\n", ch);
}
輸出會多一個 FFFFFFFF,因為讀完最後一字節後標誌未置位,再讀一次才置位。
ch = fgetc(fp);
while (feof(fp) == 0) {
printf("%0X\n", ch);
ch = fgetc(fp);
}
unsigned char ch1 = 0xFF; // 255
char ch2 = 0xFF; // -1 (有號)
char ch3 = 0x73; // 115
int a = ch1; // 0x000000FF = 255
int b = ch2; // 0xFFFFFFFF = -1 (符號擴展)
int c = ch3; // 0x00000073 = 115
int 接收 fgetc/getc 返回值char 通常安全(無 0xFF),但建議統一用 int返回值 != EOF,輔助 feof/ferror 區分錯誤