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

时间:2016-11-04 07:55:00

标签: c loops fgetc

交流转换器

#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

3 个答案:

答案 0 :(得分:7)

阅读fgetc() fgetc(),(强调我的

  

EOF从流读取下一个字符,并将其作为unsigned char强制转换为int,或者在文件末尾或错误时为while

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

您需要将文件指针重置为流的开头(使用man pagerewind())从头开始重新开始。

那就是说,

  • int返回char,而EOF太短,无法存储所有可能的返回值(例如,c本身) 。将int的类型更改为int main()
  • 对于托管环境,int main(void)至少应$state.go('editUser', {id: 0, pid: 0}); // or In your view : <a ui-sref="editUser({id:0,pid:0})">Add New user</a> 符合标准。

答案 1 :(得分:3)

for循环的第一次运行中,整个文件都用完了,你永远不会重置它。因此它只会成功搜索字符0x41

您需要在while循环后执行这两项操作之一:

fseek(file, 0, SEEK_SET);

rewind(file);

第一个is preferred because of better error handling

答案 2 :(得分: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;
}