プログラムの一部のコードに問題があります。私はファイルを読み込み、それを構造体に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行しか印刷されず、ファイルの始めから終わりまでは行かず、途中から内容を取ります。多くの行にも間違った書式があります。
入力と出力の例を提供してください。 'count_lines()'とは何ですか?デバッグの助けを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体の中でそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。 – Stargateur
'fscanf'の戻り値をチェックし、失敗したら何かをする必要があります。コードが立っているので、予期せずフォーマットされた入力のために、これらの呼び出しのいずれかが失敗した場合、それは "不本意"になり、同じ不適切な入力を試して失敗します。 –
'%[A-Za-z] s'のような書式はおそらく間違っています。私は '%[A-Za-z]'が '' s ''がなくてもいいと思っています。 [この最近の回答](https://stackoverflow.com/questions/47445131/how-to-read-string-separated-by-with-scanf/47445307#47445307)を参照してください。 –