3

私は CI でのファイル処理が初めてで、c で行数と文字数をカウントするプログラムに取り組んでいます。いいえを数えます。私のコードは次のとおりです。

 main()
{
    FILE *fp;
    int c,nl=0,nc=0;
    char str[20];
    printf("Enter filename\n");
    scanf("%s",str);
    fp=fopen(str,"r");
    if(fp==NULL)
    {
        while(1)
        {
        printf("File does not exist\n");
        printf("Enter new filename\n");
        scanf("%s",str);
        fp=fopen(str,"r");
        if(fp!=NULL)
        break;
        }
    }
    c=getc(fp);
    while(c!=EOF)
    {
        if(c=='\n')
        nl++;
        nc++;
        c=getc(fp);
    }
    printf("no of lines=%d no of char=%d",nl,nc);
}

私の実装の何が問題になっていますか?.いいえを数える他の方法はありますか? 行の?

4

4 に答える 4

8

それは、行の定義によって異なります。ファイルに 'a' という 1 文字しか含まれていない場合、そのファイルは 1 行ですか、それとも 1 行もありませんか? プログラムのロジックでは、行がありません。

whileループの最後で、終了の外側に}次の行を追加できます。

if (c != '\n') nl++;

最後の文字が改行でない場合は、余分な行が追加されます。また、ゼロに初期化する必要がありますc。そうしないと、ファイルが空の場合に予期しない結果が発生します。

他の回答からわかるように、ファイル内の行数を数えることが何を意味するのかは完全には明確ではありません。コードを書き始める前に、何をカウントしようとしているのかを明確に理解していることを確認してください。

于 2012-12-29T08:14:44.173 に答える
3

\nファイルの最後の行は、改行文字で終了する必要はありません。したがって、プログラムは「行」の数ではなく、改行の数を報告します (これは慣例的に定義された概念です)。

于 2012-12-29T08:14:54.187 に答える
3

【編集済】

「\n」を行末として数えているため、最終結果は 1 少なくなりますが、最後の行には「\n」が行末として含まれていません。キャラクターが見つからないだけです。(私のエラー@Basileを指摘してくれてありがとう)

したがって、正しい答えを得るには、while ループの外側の行数を増やすだけです。

@DavidSchwartz は、この回答が不十分であり、明白なことを指摘しています。完全を期すために、以下を追加します ( David Schwartz によるソリューションに続きます)。

于 2012-12-29T08:15:01.547 に答える
1

\n最後の行は、 ..に遭遇していないため、プログラムではカウントされません。

最後の行もカウントするロジックを記述します。

于 2012-12-29T08:35:20.323 に答える