1

私は、ファイルを非常に単純に読み取り、ファイルに含まれていたものを適切に出力するコードを書いています。

私はいつもそのようなプログラムをファイルの終わりで終了させるのに苦労していて、適切な解決策を見つけたと思いますが、私を超えた理由で、各行が私の出力で2回印刷されています。

これが私のメインファイルです:

int main(int argc, char *argv[]) {
    // insure 2 arguments given, one for a.out and one for the test file
    if (argc != 2) {
        // result if request fails
        printf("Requires 2 arguments. Be sure to include test file location\n");
        return 0;
    }

    FILE *fp; //open the file
    fp = fopen(argv[1], "r");

    char option;
    int key;
    int i = 0;
    while (fscanf(fp, "%c %d", &option, &key) != EOF) {
        printf("%d\n", key);
    }
}

重要なのは2回印刷することです!

うまくいけば、これは問題への過度の露出のために私が見落としている単純なエラーです。

4

2 に答える 2

0

あなたはおそらく欲しい:

fscanf(fp, "%c %d\n", &option, &key);

また、の戻り値をチェックして、fscanf2に等しいことを確認します。

ループの最初の反復では、改行は消費されていません。

2番目の反復では、改行が消費されて入力されますが、option%d一致せず、1をfscanf返します。 key変更されていないため、再度出力されます。

3回目の反復では、fscanf最後にを返しますEOF

一般的な規則:戻り値を常にチェックして、期待どおりであることを確認してください。(また、からのリターンのチェックに失敗することにより、このルールに違反しfopenます。)最悪の場合、何もしません。せいぜい、このような問題をデバッグするのに役立ちます。

于 2012-11-27T02:18:06.763 に答える
0
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Requires 1 argument - a file name\n");
        return 1;
    }

    FILE *fp; //open the file
    if ((fp = fopen(argv[1], "r")) == 0)
    {
         fprintf(stderr, "Failed to open file %s\n", argv[1]);
         return 1;
    }

    char option;
    int key;
    while (fscanf(fp, "%c %d", &option, &key) == 2)
        printf("%d\n", key);
    return 0;
}

エラー報告とファイル読み取りプロセスの変更に注意してください。コードはまだおそらくあなたが望むものではありません。最初の行の後に格納されている入力の最初の行の後の番号の後に改行が入る場合がありますoptionfgets()とを必要とする修正sscanf()

#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Requires 1 argument - a file name\n");
        return 1;
    }

    FILE *fp; //open the file
    if ((fp = fopen(argv[1], "r")) == 0)
    {
         fprintf(stderr, "Failed to open file %s\n", argv[1]);
         return 1;
    }
    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), fp) != 0)
    {
        char option;
        int key;
        if (fscanf(fp, "%c %d", &option, &key) == 2)
            printf("%d\n", key);
        else
        {
            fprintf(stderr, "Format mismatch on %s", buffer);
            fclose(fp);  // Not 100% necessary here, but tidiness is important
            return 1;
        }
    }
    fclose(fp);          // Not 100% necessary here, but tidiness is important.
    return 0;
}

終了前に閉じfpましたが、プログラムがいつ終了するかは重要ではなく、returnfrommain()はとほぼ同じですexit()。それ以外の機能にあった場合はmain()、ファイルストリームなど、割り当てたリソースを確実に解放することが非常に重要ですfp

警告:コンパイルされていないコード。警告レクター。

于 2012-11-27T02:25:31.517 に答える