导致故障的getc(fp)

导致故障的getc(fp),c,eof,getc,C,Eof,Getc,这是我的密码 #include<stdlib.h> #include<stdio.h> int main(int argc,char** argv) { char a; a=9; FILE * fp; fp=fopen(argv[1],"r"); while(a!= EOF) { a=fgetc(fp); printf("\n%d",a); } } #包括 #包括 int main(

这是我的密码

#include<stdlib.h>
#include<stdio.h>
int main(int argc,char** argv)
{
    char a;
    a=9;
    FILE * fp;
    fp=fopen(argv[1],"r");
    while(a!= EOF)
    {
        a=fgetc(fp);
        printf("\n%d",a);
    }
}
#包括
#包括
int main(int argc,字符**argv)
{
字符a;
a=9;
文件*fp;
fp=fopen(argv[1],“r”);
while(a!=EOF)
{
a=fgetc(fp);
printf(“\n%d”,a);
}
}
输出到这是正常的,但在最后我得到了一个奇怪的字符-1(因为我打印的是整数值)

如何仅在
EOF
处停止?
还有,这个字符是什么?

您正在打印
EOF
字符(
-1
),因为您没有检查
EOF
是否在
fgetc()
之后立即遇到。请将循环的结构更改为:

int a; /* not char, as pointed out by R... */

for (;;)
{
    a = fgetc(fp);
    if (EOF == a) break;
    printf("\n%d", a):
}

您正在打印
EOF
字符(
-1
),因为您没有检查
EOF
是否在
fgetc()
之后立即遇到。请将循环的结构更改为:

int a; /* not char, as pointed out by R... */

for (;;)
{
    a = fgetc(fp);
    if (EOF == a) break;
    printf("\n%d", a):
}

在出现以下情况时,为什么不停止

do {...}while(a != EOF)
我假设在读取它之后,a得到了EOF值。
因此,您可以额外执行一次循环

为什么不在
出现此情况时停止

do {...}while(a != EOF)
我假设在读取它之后,a得到了EOF值。
因此,除了其他答案中的方法外,您还可以多做一次循环

,您也可以这样做:

while ((a = fgetc(fp)) != EOF)
{
    printf("%d\n", a);
}
现在您有了一些替代解决方案。:)


编辑:作为R。。因此,请提醒我们,您还必须将
a
的类型更改为
int
除了其他答案中的方法外,您还可以这样做:

while ((a = fgetc(fp)) != EOF)
{
    printf("%d\n", a);
}
现在您有了一些替代解决方案。:)


编辑:作为R。。因此,请提醒我们,您还必须将
a
的类型更改为
int

您需要使
a
具有类型
int
,因为该类型是
fgetc()
的返回类型,并且需要正确表示EOF。

您需要使
a
具有类型
int
,由于该类型是
fgetc()
的返回类型,需要正确表示EOF。

不要忘记检查fopen()返回值,不要忘记fclose()不要忘记检查fopen()返回值,不要忘记fclose(),这将至少在循环中运行一次,如果
fgetc
立即返回
EOF
,则仍然打印
-1
。这将至少在循环中运行一次,如果
fgetc
立即返回
EOF
,则仍然打印
-1
。这是CTS中最常见的解决方案这是CTS中最常见的解决方案这并不能解决
a
类型错误(
char
而不是
int
)的问题……是,但只是希望让OP在盲目接受某些东西之前注意到下面的正确答案。现在将其删除。这并不能解决
a
的类型错误(
char
而不是
int
)的问题……是的,但只是希望OP在盲目接受某些内容之前注意到下面的正确答案。现在删除它。