2017-11-26 2 views
1

약 200 줄의 파일을 읽은 다음 다른 줄을 구조체에 저장하려고합니다. 그래서C89의 구조체에 여러 줄의 파일 읽기

"Tom HALL"       32 ENG 
"Ryan SMITH"       24 USA 

내 문제를 내가 그 파일을 읽을 수 있겠 방법 확실하지 않다, 그리고 넣어 경우 : stuct은 다음과 같습니다 : 같은 설정이

struct person_data{ 
    char name[20]; 
    char lastname[30]; 
    int age; 
    char country[3] 
}; 

라인을 파일에 정보를 구조체에 저장합니다. 어떻게 파일을 내 구조체에 저장하고 인쇄하려고했는지는 알지만 결과는 충돌하기 전에 내 컴퓨터의 디렉토리 경로와 이상한 심볼이 많습니다. 내 코드는 다음과 같습니다

int main(){ 
FILE *fp; 
fp = fopen("person.txt", "r"); 
person_data *person = malloc(sizeof(struct person_info)); 
int i = 0; 
if(fp != NULL) { 
    while (i < 200) { 
     fscanf(fp, "%[A-Za-z] %[A-Z] %d %[A-Z]", 
       person[i].name, 
       person[i].lastname, 
       &person[i].age, 
       person[i].country); 

     i++; 
    } 
} 
else{ 
    perror(fp); 
} 
for (i = 0; i < 200; i++) { 
    printf("%s %s %d %s", 
      person[i].name, 
      person[i].lastname, 
      person[i].age, 
      person[i].country); 

} 
fclose(fp); 
return 0; 
} 

내가 무엇이 잘못되었는지 확실하지 않다, 따라서 누군가가 내가 뭘 잘못했는지와이 문제를 해결하는 방법을 알고 있다면 부탁드립니다. 내가 프로그램을 실행하는 경우는 다음과 같습니다 : 그 구조체 (200)가 필요한 경우

Output

+0

국가가 너무 짧습니다. 3 char 문자열을 저장하려면 4 개의 문자가 필요합니다. –

답변

1

먼저 malloc을보고 무엇이 잘못 됐는지 생각해보십시오. 당신은 하나의 구조체에 대해서만 malloced했습니다. 할당은 모든 유형에 대해 동일하게 작동합니다. 당신의 sizeof(sturct person_info)에 오타가 BTW

struct person_data *person = malloc(number_of_elements * sizeof(struct person_data)); 

당신은 내가 당신의 코드를 테스트 person_info struct

이없는이 문은 '아무튼 : 당신이 struct person의 배열을 할당해야하는 경우에 그렇게 t 작업 fscanf(fp, "%[A-Za-z] %[A-Z] %d %[A-Z]") 난 이유를 알아낼 수 없습니다 ...하지만 난 그냥 fscanf(fp, "%s %s %d %s")에 다시 모든 당신이 FILE* 통과 perror()에서 잘

작동하지만, 사람에서 const char *s 예상 :

perror() 함수는 표준 오류 에 시스템 또는 라이브러리 함수 호출 중 발생한 마지막 오류를 설명하는 메시지를 생성합니다.

우선 (s가 NULL이 아니고 * s가 null 바이트 ('\ 0')이 아닐 경우), 인수 문자열 s가 인쇄되고 콜론과 공백으로 low이 출력됩니다. 그런 다음 errno 의 현재 값과 개행에 해당하는 오류 메시지가 표시됩니다. 대부분 사용하려면 인수 문자열에 오류가 발생한 함수의 이름이 포함되어야합니다.

마지막 줄 문자가 '\ 0'이기 때문에 문자열에 +1 크기가 필요합니다. 귀하 국가의 경우 에 [3] 필요 [4]가 있습니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct person_data { 
    char name[20]; 
    char lastname[30]; 
    int age; 
    char country[4]; 
}; 


int main(){ 
    FILE *fp; 
    fp = fopen("person.txt", "r"); 
    struct person_data *person = malloc(sizeof(struct person_data) * 4); 
    int i = 0; 
    if(fp != NULL) { 
     while (i < 4) { 
      fscanf(fp, "%s %s %d %s", 
       person[i].name, 
       person[i].lastname, 
       &person[i].age, 
       person[i].country); 
       i++; 
     } 
    } 
    else{ 
     perror("FP ERROR: "); 
    } 
    for (i = 0; i < 4; i++) { 
     printf("%-8s %-10s %-10d %-10s\n", 
     person[i].name, 
     person[i].lastname, 
     person[i].age, 
     person[i].country); 

    } 
    fclose(fp); 
    return 0; 
} 

내 사람이 4 명으로 시도해 봅니다. 작동하고 작동합니다. 인쇄 :

"Tom  HALL"  32 ENG 
"Ryan SMITH"  24 USA 
"Hal  Al"   25 UKR 
"Peter Peters"  99 ENG 
+0

도움을 주셔서 감사합니다. 당신은 공포에 대해 옳고, 나는 그것을 바꿨습니다. 나는 그것을 작동시켜 모든 이름을 출력한다. 그러나 어떤 사람들에게는 라인이 3 비트로 나뉘어져 있고, 나머지는 잘 작동하는 반면, 나는 3에서 5로 나뉘어집니다. –

+0

대단히 고마워, 지금 문제없이 일하게되어있어. –

1

, 당신은

#define NUMBER 200 

person_data *person = malloc(NUMBER * sizeof(struct person_info)); 

또는 calloc을 사용 (초기화 구조체의 200 배 크기를 할당해야 제로에 할당 된 메모리 - 귀하의 경우 필요한 있지만 쉽게되지 않음)

person_data *person = calloc(NUMBER, sizeof(struct person_info)); 

country 요구를 읽기 그 안에 3 개의 문자 스트링을 저장하면 (@ 0으로 인해) 적어도 4 자 (@ PeterJ_01 주석)가되어야합니다.

+0

나는 그것을 시도했지만 프로그램은 단지 한 단어와 많은 0을 대신 인쇄했습니다. 파일을 읽고 구조체에 올바르게 저장하는 방법은 무엇입니까? –

+0

'fscanf'를'fscanf (fp, "% s % s % d % s");로 대체하십시오. –

+0

조금 도와 줘서 고맙습니다. –