【问题标题】:program goes in infinite loop when eof is used使用 eof 时程序进入无限循环
【发布时间】:2021-09-07 16:08:56
【问题描述】:

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

#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, unsigned char, signed char 声明s。使用int s;fgetc() 通常返回 257 个不同的值。

标签: c file eof


【解决方案1】:

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

另一方面,EOF 是负值。

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

fgetc() 返回int。你应该使用int,而不是char,来存储它的结果。

【讨论】:

  • 知道了。现在它的工作。但是我想知道如果我们没有在程序中指定 charsignedunsigned 那么编译器会采用什么类型?还是取决于我使用的环境?
  • @Suraj “还是取决于我使用的环境?” --> 是的,依赖于实现。编译器有时会提供一个选项来选择 signedunsigned char.
【解决方案2】:

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

如果它是未签名的,那么当char 值提升为int 时,EOF 实际上将变为255。而255 != -1-1EOF的值)。

这就是 fgetc 返回 int 而不是 char 的原因。所以结果可以直接和intEOF比较。

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

int s;

【讨论】:

  • 知道了。非常感谢。现在,当我使用 signed charint 时,它在这两种情况下都有效。但是我想知道,当我们在程序中直接使用 char 而不指定有符号或无符号时,编译器会理解什么?
  • 一些程序员老兄,“那么当 char 值提升为 int 时,EOF 实际上会变为 255” i--> 不完全是。 s 是促销前的 255。 s = fgetc(ptr); 导致 EOF 被保存为 255,因为 s 是一个 unsigned char
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多