为什么我的内循环只运行一次?
问题描述:
#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
循环只运行一次。
输出类似于
答
在for
循环的第一次运行时,整个文件被使用了,你永远不会重置。所以它只会成功搜索字符0x41
。
您需要while
循环后做这两个操作之一:
fseek(file, 0, SEEK_SET);
rewind(file);
答
阅读man page为fgetc()
,(重点煤矿)
fgetc()
在文件末尾或流读取下一个字符并返回为unsigned char转换为int或EOF
错误。
所以,一旦while
循环运行后,它会退出一次fgetc()
回报EOF
,它会回头率EOF
所有后续调用。
您需要将文件指针重置为流的开头(使用rewind()
或fseek()
)以重新开始。
这就是说,
-
fgetc()
返回int
和char
太短存储所有可能的返回值(例如,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;
}
也许你需要'rewind'? –
文件成为EOF。 – BLUEPIXY
你是怎么确定while循环只运行一次的? –