在C中检测EOF

时间:2009-09-15 18:31:08

标签: c stdio

我正在使用以下C代码从用户那里获取输入,直到发生EOF,但问题是此代码无效,它在第一次输入后终止。任何人都可以告诉我这个代码有什么问题。提前谢谢。

float input;

printf("Input No: ");
scanf("%f", &input);

while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}

6 个答案:

答案 0 :(得分:42)

EOF只是一个带值的宏(通常为-1)。您必须针对EOF测试某些内容,例如getchar()来电的结果。

测试流结束的一种方法是使用feof函数。

if (feof(stdin))

请注意,“结束时”状态仅在读取失败后设置为

在您的示例中,您应该检查scanf的返回值,如果这表明没有读取字段,则检查文件结尾。

答案 1 :(得分:8)

EOF是C中的常量。您没有检查EOF的实际文件。你需要做这样的事情

while(!feof(stdin))

以下是feof的文档。您还可以检查scanf的返回值。它返回成功转换的项目数,如果到达文件末尾,则返回EOF

答案 2 :(得分:4)

另一个问题是,您只能使用scanf("%f", &input);阅读。如果用户键入的内容无法解释为C浮点数,例如“pi”,scanf()调用将不会向input分配任何内容,也不会从那里进行任何操作。这意味着它会尝试继续阅读“pi”,然后失败。

鉴于其他海报正确推荐的while(!feof(stdin))更改,如果您输入“pi”,将会有无限循环打印出input的前值并打印提示,但是该程序永远不会处理任何新的输入。

scanf()返回它所输入变量的赋值数。如果它没有赋值,那意味着它没有找到浮点数,你应该阅读更多输入,例如char string[100];scanf("%99s", string);。这将从输入流中删除下一个字符串(最多99个字符,无论如何 - 额外的char用于字符串上的空终止符。)

您知道,这提醒了我讨厌scanf()的所有原因,以及为什么我使用fgets()代替,然后使用sscanf()解析它。

答案 3 :(得分:-1)

作为起点,您可以尝试替换

while(!EOF)

while(!feof(stdin))

答案 4 :(得分:-1)

您想检查scanf()的结果以确保转换成功;如果没有,那么三件事之一就是真的:

  1. scanf()阻塞了对%f转换说明符无效的字符(即,不是数字,点,'e'或'E');
  2. scanf()检测到EOF;
  3. scanf()在读取标准输入时检测到错误。
  4. 示例:

    int moreData = 1;
    ...
    printf("Input no: ");
    fflush(stdout);
    /**
     * Loop while moreData is true
     */
    while (moreData)
    {
      errno = 0;
      int itemsRead = scanf("%f", &input);
      if (itemsRead == 1)
      {
        printf("Output: %f\n", input);
        printf("Input no: ");
        fflush(stdout);
      }
      else
      {
        if (feof(stdin))
        {
          printf("Hit EOF on stdin; exiting\n");
          moreData = 0;
        }
        else if (ferror(stdin))
        {
          /**
           * I *think* scanf() sets errno; if not, replace
           * the line below with a regular printf() and
           * a generic "read error" message.
           */
          perror("error during read");
          moreData = 0;
        }
        else
        {
          printf("Bad character stuck in input stream; clearing to end of line\n");
          while (getchar() != '\n')
            ; /* empty loop */
          printf("Input no: ");
          fflush(stdout);
        }
     }
    

答案 5 :(得分:-1)

while(scanf("%d %d",a,b)!=EOF)
{

//do .....
}