使用eof时程序进入无限循环

program goes in infinite loop when eof is used

下面的程序编译成功,没有错误,但进入了无限循环

#include <stdio.h>
int main()
{
    FILE *ptr;
    char s;
    ptr = fopen("checkit.txt", "r");
    if (ptr == NULL)
        perror("Cause of error is: ");
    else
    {
        while (1)
        {
            s = fgetc(ptr);
            if (s == EOF)
                break;
            printf("%c", s);
        }
        fclose(ptr);
    }
    return 0;
}

但是编译器显示以下警告。

warning: comparison of constant -1 with expression of type 'char' is always false [-Wtautological-constant-out-of-range-compare]
                        if (s == EOF)

我在不使用 EOF 的情况下编写了相同的程序,然后编译并 运行 成功并打开了文件。 以下是没有任何错误或警告的工作程序

#include <stdio.h>
int main()
{
    FILE *ptr;
    char s;
    ptr = fopen("checkit.txt", "r");
    if (ptr == NULL)
        perror("Cause of error is: ");
    else
    {
        while (1)
        {
            s = fgetc(ptr);
            if (feof(ptr))
                break;
            printf("%c", s);
        }
        fclose(ptr);
    }
    return 0;
}

我无法理解 EOF 不起作用的原因是什么

如果 char 是有符号或无符号整数类型,则由实现定义。

如果它是无符号的,那么当 char 值提升为 int 时,EOF 实际上会变成 255。而255 != -1-1EOF的值)。

这就是 fgetc return 一个 int 而不是 char 的原因。所以结果可以直接比作intEOF.

似乎在您的系统上 char 是无符号的,因此要解决您的问题,请将 s 定义为 int 变量:

int s;

看起来 char 在您的环境中是一个比 int 短的无符号类型。

另一方面,EOF是一个负值。

无符号值永远不会是负数。

fgetc()returnsint。您应该使用 int 而不是 char 来存储其结果。