1

fscanf を使用してテキスト ファイルを読み込もうとしています。入力ファイルは次のようになります。

1
Test
0
32.1

ランダムな値として読み取られる最初の整数を除いて、すべて正常に読み取られます。

私のコード:

while((fgets(string,64,fp) != NULL)){
    fscanf(fp, "%i\n", &tid);
    fscanf(fp, "%s\n", name);
    fscanf(fp, "%d\n", &stat);
    fscanf(fp, "%f\n", &per);
    printf("%d %s %d %f", tid, name, stat, per);
    }

出力:

11281472 Test 0 32.0999982

誰かが私が間違っていることを知っていますか?

参照用の関数全体:

Task *readData(Task *strt, char *fname){
    #ifdef DEBUG
        fprintf(stderr, "Entered Data import method\n");
    #endif
    char name[30];
    int tid, stat;
    float per;

    FILE *fp;
    fp= fopen(fname, "r");

    if(fgetc(fp) == EOF){
        printf("File is empty");
    }
    else{
    while(!feof(fp)){

        fscanf(fp, "%i\n", &tid);
        fscanf(fp, "%s\n", name);
        fscanf(fp, "%d\n", &stat);
        fscanf(fp, "%f\n", &per);
        printf("%d %s %d %f", tid, name, stat, per);
        strt = AddB(strt, tid, name, stat, per);
        }
    }
    return (strt);
}
4

2 に答える 2

2

fgets入力ファイルの最初の文字列の読み取り (消費) を行い、まずfscanf"Test" を "%i" 形式として解析しようとして失敗します。

while ループで as 条件を使用することもできますfeofが、(John Bode に感謝します) すべての fscanf をチェックし、フラグ or を使用することをお勧めしますbreak

Everyfscanfは値を返します。1で述べたように:

戻り値

正常に完了すると、これらの関数は、正常に一致して割り当てられた入力項目の数を返します。この数は、初期のマッチングの失敗の場合にゼロになることがあります。最初の一致の失敗または変換の前に入力が終了した場合、EOF が返されます。読み取りエラーが発生した場合、ストリームのエラー インジケータが設定され、EOF が返され、エラーを示すために errno が設定されます。

そのため、すべての fscanf の戻り値をチェックして、何か問題が発生 (読み取り) していないかどうかを確認することをお勧めします。

更新: fgets/fgetc を使用して何かをチェックすることは絶対にしないでください ( で巻き戻しfseekまたは元に戻すことなくungetc)。これは、すべてのファイル読み取り関数がファイルからデータを消費するためです (ファイル内の現在の位置がインクリメントされます)。エラーを確認するには、入力の解析に使用した通常の fscanf/other 関数の戻り値を確認します。

于 2012-04-29T13:22:06.240 に答える
0

各呼び出しの失敗を確認できなかったため、何が起こったのかわかりません。

(これを編集して、 %i が無効であるという主張を削除しました。申し訳ありません)

于 2012-04-29T13:23:35.380 に答える