2017-11-25 6 views
0

내 프로그램의 일부 코드에 문제가 있습니다. 나는 파일을 읽고 내용을 한 줄씩 구조체에 넣어야한다. 파일은 약 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 줄만 인쇄되며 파일 시작부터 끝까지 가지 않고 중간에서 내용을 가져옵니다. 많은 행에도 잘못된 형식이 있습니다.

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

나는이 두 가지 문제가 있다고 생각하지 않는다. count_lines()는 단지 정수를 반환하고, 모든 이름은 그 형식에 맞는다. 나는 그가 아마도 내 메모리 할당과 관련이 있다고 말한 친구에게 말했고 그는 정적 할당을 사용해야한다고 말했다. 그러나 나는 어떻게해야하는지, 얼마나 많은 기억이 필요한지 잘 모르겠습니다. –

관련 문제