0

次のようなテキストファイルがあります。

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20

整数の 2 次元配列を読み込みたい。問題は、ファイルが 2 次元データの次元に関する情報を提供していないことです。私は次のようにしてみました:

FILE *input_file = fopen(argv[1], "r");
while (! feof(input_file)) {
    read = fscanf(input_file, "%d%c", &x, &del);
    if (read != 2) {
        i--;
        break;
    }
    in_data[i][j] = x;
    if ( del == '\n') {
        i++;
        j =0;
        continue;
    }
    j++;
}

このコードは、行の最後のデータ項目の後の文字が改行の場合は正常に機能しますが、それ以外の場合は失敗します。データの次元を事前に知らなくても、ファイルから 2 次元データを読み取る信頼できる方法は何ですか?

4

1 に答える 1

1

簡単な方法は、 を使用fgetsして一度に 1 行ずつ読み取ることです。その後、 を使用strtolして値を読み取ることができます。endptr次の値を読み取ることができるように、それが設定するポインターを利用します。

別の方法として、一度に 1 文字ずつ読み取ることで空白を消費する短い関数を作成することもできます。そこで改行を処理できます。空白以外に遭遇するまで読み、 を使用してその文字をストリームに戻しますungetc。このようなもの:

// Returns false if EOF or error encountered.
int eat_whitespace( FILE *fp, int *bNewLineEncountered )
{
    int c;
    *bNewLineEncountered = 0;

    while( EOF != (c = fgetc(fp)) ) {
        if( c == '\n' ) {
            *bNewLineEncountered = 1;
        } else if( !isspace(c) ) {
            ungetc(c, fp);
            break;
        }
    }

    return (c != EOF);
}
于 2013-04-01T05:55:50.823 に答える