【问题标题】:Read the length of 5 strings in file读取文件中5个字符串的长度
【发布时间】:2022-01-13 07:50:12
【问题描述】:

大家好,我对代码 C 有这个问题:读取包含 5 个字符串的输入数据(input02.txt),然后将每个字符串的长度写入新文件。 文件中的字符串:

Five little
Monkeys jumping
On the bed
One fell off
And bumped his head

这是我的代码:

#include <stdio.h>
#include <string.h>

int main(){
    char s[100];
    int m,c=1;
    FILE *fin,*fout;
    fin = fopen("input02.txt", "r");
    fout = fopen("length.txt", "w");
    if (fin!=NULL){
        while(!feof(fin)){ 
            fgets(s, 100, fin);
            m=strlen(s);
            while(c<6){
                fprintf(fout,"Length of %d string: %d\n",c,m);
                c++;
            }
        }
        fclose(fin);
        fclose(fout);
    }
    return 0;
}

但 length.txt 文件中的输出显示如下:

Length of 1 string: 12
Length of 2 string: 12
Length of 3 string: 12
Length of 4 string: 12
Length of 5 string: 12

我能得到一些帮助吗,你

【问题讨论】:

  • 至少这个问题:while(!feof(fin)){ fgets(s, 100, fin); --> while(fgets(s, sizeof s, fin)) { Why is “while ( !feof (file) )” always wrong?
  • 抱歉没有运气 :( 输出还是一样的
  • while(c&lt;6) 更改为if (c &lt; 6)
  • 更好的是,更改while(c&lt;6) --> /*nothing */。在上面的feof() 修复之后,这里不需要测试。
  • @tinkdinkphiu 忽略空间是一个单独的问题。请写一个新问题,并用代码、示例输入、实际输出和预期输出详细说明您的要求。

标签: c file


【解决方案1】:

目前还不清楚你想用这个内部循环实现什么。

            while(c<6){
                fprintf(fout,"Length of %d string: %d\n",c,m);
                c++;
            }

它将打印相同字符串的长度 6 次。

在读取输入行的外循环的下一个循环中,c 的值将已经是6,因此对于第 2 行或以后的输入行将不会再次调用内循环。


删除内部循环将解决问题

        while(!feof(fin)){ 
            fgets(s, 100, fin);
            m=strlen(s);
            fprintf(fout,"Length of %d string: %d\n",c,m);
            c++;
        }

除此之外还有这样的循环

    while(!feof(fin)){ 
        /* ... */
    }

总是错误的,因为feof 会告诉您是否在执行某些输入操作后达到 EOF。

正如comment 中已经提到的,正确的循环实现是

        while(fgets(s, sizeof s, fin)) {
            m=strlen(s);
            fprintf(fout,"Length of %d string: %d\n",c,m);
            c++;
        }

【讨论】:

    【解决方案2】:

    考虑这个循环

    while(c<6){
        fprintf(fout,"Length of %d string: %d\n",c,m);
        c++;
    }
    

    它将继续打印和递增c,而不会更改仅在外循环中设置的m 的值。将 while 更改为 if 以修复它,假设您仍然需要将打印的字符串数限制为前 5 个。(更通用的程序只会读取文件中的任何内容,在这种情况下条件不是需要。)

    (您收到的关于不使用feof 作为循环条件的评论仍然有效;也修复它,尽管它与此错误没有直接关系。)

    【讨论】:

    • 谢谢你,我设法修复它
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2013-01-23
    • 1970-01-01
    • 2011-10-12
    • 2020-06-16
    • 2013-12-29
    相关资源
    最近更新 更多