【问题标题】:getc(fp) causing troublegetc(fp) 造成麻烦
【发布时间】:2012-03-11 19:03:00
【问题描述】:

这是我的代码。

#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);
    }
}

对此的输出没问题,但最后我得到了一个带有 -1 的奇怪字符(因为我正在打印整数值。

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

【问题讨论】:

  • 别忘了检查 fopen() 返回值
  • 别忘了 fclose()

标签: c eof getc


【解决方案1】:

除了其他答案中的方法,您还可以这样做:

while ((a = fgetc(fp)) != EOF)
{
    printf("%d\n", a);
}

现在您有一些替代解决方案。 :)

编辑: R.. 好心提醒我们,您还必须将 a 的类型更改为 int

【讨论】:

  • 这是C语言中最常见的解决方案
【解决方案2】:

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

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

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

【讨论】:

  • 这并不能解决a类型错误的问题(char而不是int)...
  • 是的,但只是希望让 OP 在盲目接受之前注意到下面的正确答案。立即删除。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你为什么不用这个条件停止while

    do {...}while(a != EOF)
    

    我想在 AFTER 读取它之后获得了 EOF 值。 所以,你多做一次循环

    【讨论】:

    • 这将至少运行一次循环,如果fgetc 立即返回EOF,仍会打印-1
    猜你喜欢
    • 2015-09-17
    • 2016-07-16
    • 2022-07-22
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多