0

scanf とそれが実際にどのように機能するかを理解するのに苦労しています。次のテキストファイルがあります。

this    is  a   test    !
25.0    400.0   400.0   0.0     0.0
20.0    200.0  400.0    3.0 4.0
30.0    50  600.0   1 .0    2.0
50.0    400.0  200.0    1 .0    -2.0
40.0    700.0   700.0   -1 .0   -2.0

基本的に、コードは各行を読み取り、それらを個々の配列に割り当てることになっています (配列 A は最初の列から浮動小数点数を取得し、配列 B は 2 番目の列から浮動小数点数を取得するなど)。私が理解できた唯一のことは、読み取り用にファイルを開く方法です。

FILE *file = fopen( argv[1], "r" );

しかし、1行目、2行目、3行目、4行目からdoubleを抽出する方法がわかりません。ちなみに、条件ステートメントを使用して1行目をスキップしました。そして、私は次のように残りを読みました:

while  (fgets(line, sizeof(line), file))
            {
                    if (count < 1)
                    {
                            //printf("%s", line);
                            count++;
                    }
                    else
                    {
                            printf("%s", line);
                    }

            }

行は印刷されていますが、繰り返します...個々の番号を抽出する方法がわかりません。助けていただければ幸いです。

編集:選択されたソリューション

このテスト アプリケーションで使用したコードを次に示します。回答で述べたように、テキスト ファイルにはタイプミスがあり、データのスキャンが難しくなり、コードを実行する前に編集する必要があります。また、配列を操作するには、「int i = 0」の宣言を追加する必要があります。

while  (fgets(line, sizeof(line), file))
            {
                 if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) ) 
                 {
                     i++;
                 } 
                 else 
                 {
                     printf( "Parse failed\n" );

                 }

            }
4

2 に答える 2

2

このようなもの:

if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) ) {
    /* Do something with values */
} else {
    printf( "Parse failed\n" );
}

Whereiは、有効なデータ行ごとにインクリメントされます。

于 2013-11-07T01:04:34.780 に答える
1

このようなループで使用するstrtok()atof()、5 x 10 の配列が得られます:

問題の一部である可能性がある OP 入力ファイルで余分なスペースを拾いました。3 行目と 4 行目の入力の余分なスペースを削除1 .01.0ました。

25.0    400.0   400.0   0.0     0.0
20.0    200.0  400.0    3.0 4.0
30.0    50  600.0   1.0    2.0
50.0    400.0  200.0    1.0    -2.0
40.0    700.0   700.0   -1.0   -2.0

int main(void)
 {
    char *buf;
    char line[80];
    float A[5][10];//hard-coded to accommodate the input file, change as necessary. 
    FILE *file;
    file = fopen("c:\\dev\\play\\test.txt", "r");
    int i=0, j=0;
    i = -1;
    j = -1;
    while(fgets (line, sizeof(line), file))
    {
        j++;
        buf = strtok(line, " \n\t");
        while(buf)
        {
            i++;
            A[i][j] = atof(buf);
            buf = strtok(NULL, " \n");
        }
        i=-1;
    }
    fclose(file);
 }

出力は、それぞれ 5 つの列の内容を含む 5 つの配列 A[0] から A[4] になります。

于 2013-11-07T01:12:56.400 に答える