내 프로그램의 일부 코드에 문제가 있습니다. 나는 파일을 읽고 내용을 한 줄씩 구조체에 넣어야한다. 파일은 약 800 줄이며, 파일의 내용을 포함해야하는 구조체를 인쇄하려고 할 때 약 30 줄만 인쇄합니다. 나머지는 오류 또는 잘못된 형식으로 보관됩니다. 이것은 지금 내 기능이며, 나는 단순히 main에서 호출한다. 무엇이 잘못 되었는지 모르지만 malloc 호출과 관련이있을 수 있습니다.fscanf를 사용하여 파일에서 거대한 입력을 구조체로 가져 오는 방법. ANSI C89 (90)
이RaceName "Name LASTNAME" AGE TEAM Country Position TIME
목표는 모두 800 선이되도록 구조체를 인쇄하는 것입니다 :
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;
의 선입니다 파일과 동일한 형식으로 인쇄됩니다. 그러나 인쇄 될 때 약 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)을 참조하십시오. –