关于while(!EOF)的问题

时间:2011-06-08 07:34:53

标签: c stdin eof

我正在阅读stdin的值,我想继续阅读该文件,直到我完成阅读,所以我正在使用

while(!EOF){ scanf(...) }

但是,代码片段似乎没有做任何事情,

while(!EOF){


    scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &safeRegionWidth);

    printf("---imageWidth=%d imageHeight=%d safeRegionStart=%d safeRegionWidth=%d---\n", imageWidth, imageHeight, safeRegionStart, safeRegionWidth);
    totalP = imageWidth * imageHeight ;
    totalSafeP = imageHeight * safeRegionWidth;


    printf("---total # of pixels: %d Total # of safe Pixels: %d---\n\n", totalP, totalSafeP);

    i=1;

    while(i!=totalP)
    {
        i++;
        scanf("%d", &pixel);
        printf("\nValue of pixel %d", pixel);


    }//End for scanning all pixels*/
}//while loop
编辑:我修好了

while(scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &safeRegionWidth)==4&&!feof(stdin)) { }

!feof(stdin)可能没有必要。

4 个答案:

答案 0 :(得分:8)

EOF只是一个整数常量。在大多数系统上,它是-1!-1falsewhile(false)不会做任何事情。

您想要检查scanf的返回值。 scanf返回成功读取的项目数,最终返回EOF

答案 1 :(得分:2)

嗯,这很容易回答:

EOF是常数#define,例如#define EOF -1

因此,您的while(!EOF)条件将始终为false,并且循环将不会执行。您需要检查scanf对EOF的返回值。

您需要以下内容:

while(scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &safeRegionWidth) != EOF){

答案 2 :(得分:1)

您必须使用变量来保存可能EOF的char值。像...这样的东西。

while(4==scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &safeRegionWidth)) {
//do stuff
}

否则!EOF总是错误的。

答案 3 :(得分:1)

永远不会输入循环。 EOF是一个常量值-1(对此定义检查stdio.h)。所以!EOF0,这是假的,因此永远不会输入。

要检查文件是否已结束,您可以使用:if (feof (file_ptr)) break;

while (1)
{
   /* Read file */
   if (feof (file_ptr))
     break;
   /* Do work */
}