2015-07-07 2 views
0

Я пытаюсь заполнить структуру данными файла.Заполнение структуры данными в файле

Файл отделяется с двойной точкой, как это:

string1:15 

Когда я прочитал файл и заполнить поля на структуры с данными я получаю Segmentation Fault.

Здесь структура файла character.h:

#ifndef CHARACTER_H_ 
#define CHARACTER_H_ 

typedef struct Character *Personaje; 

struct Character{ 
     char name[20]; 
     int lvl; 
}; 


extern void saveCharacter(char *name, int lvl); 
extern Personaje *getCharacter(); 
extern char *toString(Personaje *pj); 
#endif 

и здесь функция в исходном файле character.c:

Personaje *getCharacter(){ 
     FILE *fp; 
     Personaje *salida = (Personaje*) malloc(sizeof(Personaje)); 
     fp = fopen("kprct", "rb"); 

     fscanf(fp, "%[A-Za-z]:%d", (*salida)->name, &((*salida)->lvl)); 
     printf("Linea: %s : %d\n", (*salida)->name, (*salida)->lvl); 

     fclose(fp); 
     return salida; 

} 

Как я могу заполнить-структуру с файлом данные?

+0

Стандартное предупреждение: не отбрасывают '' недействительным *, возвращаемый 'malloc' и друзьями! – Olaf

+0

Вы не ограничиваете размер массива, который вы читаете. Это приглашение на переполнение буфера (иначе: неопределенное поведение). – Olaf

+0

там нет malloc для вашей структуры 'Character', если я не ошибаюсь. – Dleep

ответ

1

Подсказка: не выведите указатель на свою структуру, а сам блок. Это гораздо менее запутанно и позволит избежать проблемы, с которой вы столкнулись здесь: выделить место для указателя, а не структуры.

Также вы определяете Character **:

Personaje *salida = (Personaje*) malloc(sizeof(Personaje)); 

Итак: с данными определениями типа:

Personaje salida = malloc(sizeof(*salida)); 

Примечание: с помощью *salida в sizeof делает этот термин независимый от типа salida.

Остальная часть вашего кода также не работает, так как ваши функции также имеют один * слишком много. Personaje.

Правильное определение было бы:

typedef struct { 
     char name[20]; 
     int lvl; 
} Personaje;  // or name the type just Character 

Тогда для прототипов, использовать Personaje *, как у вас уже есть. malloc -линии будет:

Personaje *salida = malloc(sizeof(*salida)); 

(Примечание. Я не должен изменить sizeof() -argument)

Дополнительные вопросы:

  • Всегда проверить результаты системы функции, поскольку они могут сообщать об ошибке. malloc может возвращать NULL, функции файла могут сообщать об ошибке.
  • Всегда ограничивает количество символов fscanf читает в массив символов! Как и сейчас, это приглашение на переполнение буфера, например, неопределенное поведение.
  • Не отвергни void *, которые используются malloc, free и т.д.
2

Я думаю, главная проблема здесь

typedef struct Character *Personaje; 

таким образом, вы делаете Personaje как указатель уже, а в коде, вы пишете

Personaje *salida 

, который создает указатель на указатель. Я не думаю, что это не требуется, ни то, что вы хотели. Я предлагаю, изменить ваш typedef к

typedef struct Character Personaje; 

и все доступ к переменной в fscanf() и printf().

Кроме того,

  1. Пожалуйста, не бросайте возвращаемое значение malloc() и семьи в C.
  2. Проверьте, не возвращается ли значение fopen() и fscanf().
+0

Я хочу хранить только одного персонажа, я думаю, что это проблема. Но я не могу исправить это. –

+0

@PepeFernandez: «Я хочу хранить только одного персонажа» ?? – Olaf

+1

@Olaf Не забудьте сэр, «персонаж» - это сама структура ... сбивает с толку самое лучшее :-) –

Смежные вопросы