2011-06-08 89 views
1

我正在读取stdin中的值,我想继续读取文件直到我完全读完它,所以我使用关于while(!EOF)的问题

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)可能没有必要。

+0

那么它有什么作用?你调试了吗? – Kangkan 2011-06-08 07:38:31

+0

它没有做任何事情,因为while(!EOF)被评估为false,所以while永远不会被执行。 – 2011-06-08 08:09:15

回答

8

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

你想要的是检查返回值scanfscanf返回成功读取的项目数,最终返回EOF

2

好了,这是很容易回答:

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

所以你的while(!EOF)条件将永远是假的,循环将不会执行。您需要针对EOF检查返回值scanf

你需要的东西,如:

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

其实它应该是'scanf(“%d%d%d%d”,...)== 4' – 2011-06-08 07:42:20

+0

@Let_Me_Be:非常真实,我和C一起工作已经太久了! – 2011-06-08 09:17:11

1

你必须使用一个变量来保存一个字符值,可以是潜在EOF。类似...

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

否则!EOF始终为假。

+0

因为这会导致无限循环,所以应该是'scanf(“%d%d%d%d”,...)== 4' – 2011-06-08 07:43:36

+0

你是对的。改变了!还添加了一个'feof'的情况。 – 2011-06-08 07:44:36

+1

错误。 feof()不会做你认为的事情。 – 2011-06-08 07:48:19

1

循环将永远不会被输入。 EOF是一个常数值,它是-1(对此定义检查stdio.h)。所以!EOF0这是错误的,所以它永远不会被输入。

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

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