使用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
(-1
是EOF
的值)。
这就是 fgetc
return 一个 int
而不是 char
的原因。所以结果可以直接比作int
值EOF
.
似乎在您的系统上 char
是无符号的,因此要解决您的问题,请将 s
定义为 int
变量:
int s;
看起来 char
在您的环境中是一个比 int
短的无符号类型。
另一方面,EOF
是一个负值。
无符号值永远不会是负数。
fgetc()
returnsint
。您应该使用 int
而不是 char
来存储其结果。
下面的程序编译成功,没有错误,但进入了无限循环。
#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
(-1
是EOF
的值)。
这就是 fgetc
return 一个 int
而不是 char
的原因。所以结果可以直接比作int
值EOF
.
似乎在您的系统上 char
是无符号的,因此要解决您的问题,请将 s
定义为 int
变量:
int s;
看起来 char
在您的环境中是一个比 int
短的无符号类型。
另一方面,EOF
是一个负值。
无符号值永远不会是负数。
fgetc()
returnsint
。您应该使用 int
而不是 char
来存储其结果。