2
#include <stdio.h>

int main()
{
    FILE* f=fopen("book2.txt","r");
    char a[200];
    while(!feof(f))
    {
        fscanf(f,"%s",a);
        printf("%s ",a);
        printf("%d\n",ftell(f));
    }
    fclose(f);
    return 0;
}   

上記のコードがあります。book2.txt には「abcdef abcdef」が含まれており、カーソルは改行に移動します (例:abcdef abcdef\n)。以下の結果が得られます。

abcdef 6
abcdef 13
abcdef 19

私は得ることを期待しています

abcdef 6
abcdef 13
15

私は何を間違っていますか?

4

2 に答える 2

4

I/O 操作自体をテストします。Pascal を書いている場合以外は使用しfeof()ないでください (C は Pascal ではありません!)

#include <stdio.h>

int main(void)
{
    FILE *f = fopen("book2.txt", "r");
    char a[200];
    if (f != 0)
    {
        while (fscanf(f, "%199s", a) == 1)
        {
            printf("%s ", a);
            printf("%ld\n", ftell(f));
        }
        putchar('\n');
        fclose(f);
    }
    return 0;
}

改訂されたコードはf、使用前にテストを行い、文字列の長さを変換仕様に指定することでバッファ オーバーフローを防止することに注意してください。%s空白文字まで読み取ることに注意してください。各行に空白がない限り、行は読み取られません。

トラブル報告feof()などの操作後の変換失敗、I/O エラー、EOF を区別するために使用します。fscanf()例えば:

#include <stdio.h>

int main(void)
{
    FILE *f = fopen("book2.txt", "r");
    char a[200];
    if (f != 0)
    {
        while (fscanf(f, "%199s", a) == 1)
        {
            printf("%s ",a);
            printf("%ld\n", ftell(f));
        }
        putchar('\n');
        if (feof(f))
            printf("EOF\n");
        else if (ferror(f))
            printf("I/O error\n");
        else
            printf("Conversion failed\n");
        fclose(f);
    }
    return 0;
}

を使用%sすると、変換に失敗することはなく、I/O エラーもほとんどありません。ただし、変換指定子が の場合%d、データ内の句読点文字により「変換に失敗しました」というメッセージが表示される可能性があります。

25 年以上に及ぶ C コーディングの中で、私のコードにfeof()は数千のファイルのうち 2 か所があり (私は数か月前に確認しました)、どちらの場合も、コードは EOF とエラーを区別しています (おおむね図の通り)。

于 2013-04-07T05:16:30.057 に答える