2017-11-25 14 views
0

プログラムの一部のコードに問題があります。私はファイルを読み込み、それを構造体に1行ずつ書き込む必要があります。ファイルは約800行で、構造体を印刷しようとすると、ファイルの内容が含まれるはずですが、構造体は30行程度しか印刷されません。残りの部分はエラーまたは間違った書式で提出されます。これは今の私の機能であり、私は単にそれをメインと呼んでいます。何が間違っているのかは分かりませんが、mallocコールと何か関係がありますか?fscanfを使用してファイルから構造体に膨大な入力を取り込む方法ANSI C89(90)

void read_file(void){ 
int lines = count_lines(); /*function to count amount of lines in file*/ 
FILE *file; 
int i = 0; 
char filename[] = "race.txt"; 
file = fopen(filename, "r"); 
race_info *race = malloc(sizeof(race_info)); 
if (file != NULL) { 
    while (i < lines) { 
     fscanf(file, " %[A-Za-z]s %[A-Za-z]s %[A-Z]s %d %[A-Z]s %[A-Z]s %d %d", 
       race[i].race_name, 
       race[i].name, 
       race[i].lastname, 
       &race[i].age, 
       race[i].team, 
       race[i].country, 
       &race[i].position, 
       &race[i].time); 
     i++; 
    } 
} 
else { 
    perror(filename); //print the error message 
} 
for (i = 0; i < lines; i++) { 
    printf("%s %s %s %d %s %s %d %d", 
      race[i].race_name, 
      race[i].name, 
      race[i].lastname, 
      race[i].age, 
      race[i].team, 
      race[i].country, 
      race[i].position, 
      race[i].time); 
} 
fclose(file); 
} 

構造体には、以下の通りの設定です。

#define MAX_CHAR 100 



struct race_info{ 
    char race_name[MAX_CHAR]; 
    char name[MAX_CHAR]; 
    char lastname[MAX_CHAR]; 
    int age; 
    char team[MAX_CHAR]; 
    char country[MAX_CHAR]; 
    int position; 
    int time; 
}; 
typedef struct race_info race_info; 

としてファイルからラインを設置している:目標はすべて800行があるように、構造体を印刷することである

RaceName    "Name LASTNAME"        AGE TEAM Country  Position  TIME 

ファイルと同じ書式で印刷されます。しかし、印刷すると約200行しか印刷されず、ファイルの始めから終わりまでは行かず、途中から内容を取ります。多くの行にも間違った書式があります。

example of running program

+0

入力と出力の例を提供してください。 'count_lines()'とは何ですか?デバッグの助けを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体の中でそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。 – Stargateur

+1

'fscanf'の戻り値をチェックし、失敗したら何かをする必要があります。コードが立っているので、予期せずフォーマットされた入力のために、これらの呼び出しのいずれかが失敗した場合、それは "不本意"になり、同じ不適切な入力を試して失敗します。 –

+1

'%[A-Za-z] s'のような書式はおそらく間違っています。私は '%[A-Za-z]'が '' s ''がなくてもいいと思っています。 [この最近の回答](https://stackoverflow.com/questions/47445131/how-to-read-string-separated-by-with-scanf/47445307#47445307)を参照してください。 –

答えて

2

このrace_info *race = malloc(sizeof(race_info));は、単一race_infoに領域を割り当てるように思われます。

すべての行が収まるようにするには、おそらくmalloc(lines * sizeof(race_info))が必要です。

+0

お返事ありがとうございます。私はそれを試しましたが、テキストの代わりにたくさんのゼロが印刷されました。 –

+2

それから、 'count_lines()'が行数をどのように取得するのか、他の問題があるかもしれませんか?あるいは、ある名前が '%[A-Za-z] s'形式に合わない場合は? –

+0

私はこれらの2つに問題があるとは思わない、count_lines()は整数を返すだけで、すべての名前はフォーマットに収まる。私は友人と話をしました。彼はおそらく私のメモリ割り当てと関係していました。彼は静的割り当てを試してみるべきだと言いました。しかし、私はそれをどうやってやるべきか、どれくらいの記憶が必要なのかは分かりません。 –

関連する問題