为什么我的内循环只运行一次?

问题描述:

变交流为什么我的内循环只运行一次?

#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循环只运行一次的? –

for循环的第一次运行时,整个文件被使用了,你永远不会重置。所以它只会成功搜索字符0x41

您需要while循环后做这两个操作之一:

fseek(file, 0, SEEK_SET); 

rewind(file); 

第一is preferred because of better error handling

阅读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)。 –

这应该为你做的工作:

#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; 
}