【问题标题】:Why my inner loop only run once?为什么我的内循环只运行一次?
【发布时间】:2016-11-04 07:54:59
【问题描述】:

交流

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

输出看起来像

【问题讨论】:

  • 也许你需要rewind
  • 您如何确定while 循环只运行了一次?
  • @DavidSchwartz 可能是通过查看计数器值。 (我不久前发布并删除了相同的评论。):)
  • 因为在你读完文件后你现在就在文件的末尾了?
  • rewind(file) 在 while 循环之后会完成这项工作

标签: c loops fgetc


【解决方案1】:

阅读man pagefgetc(),(强调我的

fgetc() 读取流中的下一个字符,并将其作为无符号字符转换为 int 或 EOF 在文件结尾或错误时返回。

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

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

也就是说,

  • fgetc() 返回一个int,而char 太短,无法存储所有可能的返回值(例如,EOF 本身)。将c的类型改为int
  • 对于托管环境,int main() 至少应为 int main(void) 以符合标准。

【讨论】:

【解决方案2】:

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

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

fseek(file, 0, SEEK_SET);

rewind(file);

第一个is preferred because of better error handling

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多