2011-06-08 88 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 */ 
}