关于while(!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)可能没有必要。

EOF只是一个整数常量。 在大多数系统上它是-1!-1falsewhile(false)不执行任何操作。

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

嗯,这很容易回答:

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

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

你需要这样的东西:

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

您必须使用变量来保存可能是EOF的char值。 就像是 ..

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

否则!EOF总是假的。

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

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

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