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

Pin*_*nda 5 c loops fgetc

AC

#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;
}
Run Code Online (Sandbox Code Playgroud)

A.TXT

AAABBBAAA
Run Code Online (Sandbox Code Playgroud)

我不明白为什么for循环运行完美但while循环只运行一次.

输出看起来像

在此输入图像描述

Sou*_*osh 7

阅读手册页fgetc(),(重点煤矿)

fgetc()从流中读取下一个字符并将其作为unsigned char强制转换为int,或者EOF在文件末尾或错误处返回.

因此,一旦while循环运行,它将退出一次fgetc()返回EOF并且它将继续EOF为所有连续调用返回.

您需要将文件指针重置为流的开头(使用rewind()fseek())从头开始重新开始.

那说,

  • fgetc()返回a int和a char太短而无法存储所有可能的返回值(例如,EOF本身).改变的类型cint.
  • 对于托管环境,int main()至少应该int main(void)符合标准.


小智 3

在循环的第一次运行中for,整个文件被用完,并且您永远不会重置它。所以它只会成功搜索到 character 0x41

您需要在while循环后执行以下两个操作之一:

fseek(file, 0, SEEK_SET);

rewind(file);
Run Code Online (Sandbox Code Playgroud)

第一个是首选,因为它具有更好的错误处理能力