2

.txt から行を読み取り、それらを 2 つの異なる配列に入力するプログラムを作成しようとしています。

これまでのところ、私はこれを持っています:

    #include <stdio.h>

    int main() {
        FILE * ifp = fopen("input.txt","r"); 
        FILE * ofp = fopen ("output.txt", "w"); 
        int participants = 0, i;  
        char name [10];
        float grade [10];
        float perc [10];

        fscanf(ifp, "%d", &participants);

        for (i=1; i<participants; i++) {
             fscanf(ifp, "%s", &name);

             fscanf(ifp, "%f", &grade);

        }

        printf( "%d\n", participants);
        printf( "%s\n", name);
        printf( "%f\n", grade);

        fclose(ifp);
        fclose(ofp);

        return 0;
    }

私が読もうとしているtxtは次のとおりです。

    2 
    Optimus 
    45 90 
    30 60 
    25 30 
    50 70 
    Megatron 
    5 6 
    7 9 
    3 4 
    8 10 

私の問題は、最初の 2 行をピックアップするが、数字になると停止することです。名前を配列に入れ、すべての数字を別の配列にペアで入れようとしています。現在、配列内の数字を取得しているかどうかを確認しようとしていますが、すべてを取得していません。

これは私が得る出力です:

    2
    Optimus
    0.000000

何か案は?

編集

これは、いくつかの変更後の私の新しいコードです。

    #include <stdio.h>

    int main() {
        FILE * ifp = fopen("input.txt","r");
        FILE * ofp = fopen ("output.txt", "w");
        int participants = 0, i , j; 
       char name [10];
        int grade [26];
        float perc [26];

        fscanf(ifp, "%d", &participants);

        for (i=1; i<participants; i++) {
             fscanf(ifp, " %s", name);
             fscanf(ifp, " %d", grade);

        }

        printf( "%d\n", participants);
        printf( "%s\n", name);
        printf( "%d\n", grade[0]);

        fclose(ifp);
        fclose(ofp);

      return 0;
    }

そして、私の新しい出力は次のとおりです。

    2
    Optimus
    45

編集2

後でこれらの数値を処理する必要があるのは、行の最初の数値を同じ行の 2 番目の数値で割り、10 を掛けて、数値に応じて "*" を表示させることです。したがって、次のように出力されます。

    Optimus
    +:  *****
    -:  *****
    *:  ********
    /:  *******
    Megatron
    +:  ********
    -:  *******
    *:  *******
    /:  ********

「+」は名前の下の最初の行です。「-」は同名の2行目です。3番目の「*」。4番目の「/」。

4

2 に答える 2

1

これがあなたの主な問題です:

    printf( "%f\n", grade);

ポインターをフロートとして出力しようとしています。あなたがしたいgrade[0]

この行で:

    fscanf(ifp, "%f", &grade);

これは機能しますが、正しくありません。それは、&grade[0]または単にプレーンである必要がありますgrade

もちろん、最終バージョンでは、配列の添え字を調整する必要があります。また、名前にさらに配列を割り当てる必要があります。現在、保存できるのは 1 つだけです。

データを読み込むには、プログラムを大幅に変更する必要があります。grade(最大 10 人の参加者を想定して)として宣言grade[10][8]し、8 つの整数のそれぞれを配列に格納できます。このようなループはそれを処理します:

   for (i = 0; i < participants; i++) {
      fscanf(ifp, "%s", name);             // read the name (you need to fix this)
      for (j = 0; j < 8; j++) {
        fscanf(ifp, "%d", &grade[i][j]);   // store each number
      }
   }
于 2013-03-23T00:04:48.900 に答える
0

nameおよびgradeは配列です - 変数のアドレスは配列に対して暗黙的です。したがって、これらの変数にはアドレス演算子を使用しないでください。

fscanf(ifp, "%s", name);
fscanf(ifp, "%f", grade);
于 2013-03-23T00:01:28.887 に答える