2016-11-04 86 views
5

變交流爲什麼我的內循環只運行一次?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 

    int i, counter=0; 
    char c; 

    FILE *file=fopen("a.txt","r"); 

    for (i = 0x41 ; i < 0x45; i++) 
    { 
     printf("%c(%x) ",i ,i); 
     while ((c = fgetc(file)) != EOF) 
     { 
      if (i == (char) c) 
       counter++; 
     } 
     printf("%d\n", counter); 
     counter=0; 
    } 
    fclose(file); 
    return 0; 
} 

A.TXT

AAABBBAAA 

我不明白爲什麼for循環運行非常好,但while循環只運行一次。

輸出類似於

enter image description here

+0

也許你需要'rewind'? –

+0

文件成爲EOF。 – BLUEPIXY

+0

你是怎麼確定while循環只運行一次的? –

回答

3

for循環的第一次運行時,整個文件被使用了,你永遠不會重置。所以它只會成功搜索字符0x41

您需要while循環後做這兩個操作之一:

fseek(file, 0, SEEK_SET); 

rewind(file); 

第一is preferred because of better error handling

7

閱讀man pagefgetc(),(重點煤礦

fgetc()在文件末尾或流讀取下一個字符並返回爲unsigned char轉換爲int或EOF錯誤。

所以,一旦while循環運行後,它會退出一次fgetc()回報EOF,它會回頭率EOF所有後續調用。

您需要將文件指針重置爲流的開頭(使用rewind()fseek())以重新開始。

這就是說,

  • fgetc()返回intchar太短存儲所有可能的返回值(例如,EOF本身)。將c的類型更改爲int
  • 對於託管環境,int main()應該至少爲int main(void)以符合標準。
+0

不客氣。你也可以[考慮接受幫助你的答案](http://meta.stackexchange.com/q/5234/244062)。 –

3

這應該爲你做的工作:

#include <stdio.h> 

int main(void) 
{ 

    int i, counter=0; 
    int c; 

    FILE *file=fopen("a.txt","r"); 

    for (i = 0x41 ; i < 0x45; i++) 
    { 
     printf("%c(%x) ",i ,i); 
     while ((c = fgetc(file)) != EOF) 
     { 
      if (i == c) counter++; 
     } 
     rewind(file); 
     printf("%d\n", counter); 
     counter=0; 
    } 
    fclose(file); 
    return 0; 
}