2013-04-14 4 views
-1

Я разрабатываю приложение для C для своей домашней работы, и я столкнулся с досадной катастрофой. Вот мой код:сбой fscanf при чтении структуры в C

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

//Constants 
//Available user choices 
enum commands {READ_LIST = 1, QUIT}; 

struct student { 
    char* surname; 
    char* name; 
    char* group; 
}; 

typedef struct student Student; 
typedef Student * studentPtr; 

//Globals 
int studentCount = 0; 

//Function declarations 
void displayCommands(); 
void readList(); 

//Main function 
int main() { 

    char enteredValue[999]; 
    int thisCommand; 
    int running = 1; 

    while(running) { 
     displayCommands(); 
     scanf("%s", enteredValue); 
     thisCommand = atoi(enteredValue); 
     puts("\n----------------------------------------------"); 
     switch(thisCommand) { 
      case READ_LIST: 
       readList(); 
       break; 
      case QUIT: 
       running = 0; 
       break; 
      default: 
       puts("Wrong command!"); 
       break; 
     } 
    } 
    system("pause"); 
    return 0; 
} 

void displayCommands() { 
    puts("\n---------------------------------------------"); 
    puts("Enter a command number:"); 
    printf("%d - Read students from file.\n", READ_LIST); 
    printf("%d - Quit.\n", QUIT); 
    puts("----------------------------------------------"); 
} 

void readList() { 
    FILE *fp = NULL; 

    fp = fopen("studs.txt", "r"); 

    studentPtr newStudentPtr = malloc(sizeof(Student)); 

    if(fp != NULL) { 
     fscanf(fp, "%d", &studentCount); 

     if(newStudentPtr != NULL) { 
      fscanf(fp, "%s %s %s", newStudentPtr->surname, 
        newStudentPtr->name, newStudentPtr->group); 
     } 
     fclose(fp); 
    } else { 
     puts("Unable to open file for reading!"); 
    } 
} 

Я в основном стараюсь читать целые муравьиные три строки в структуру. Программа вылетает, когда пытается прочитать последнюю строку файла.

Любая помощь, пожалуйста? Какие ошибки я делаю?

Заранее благодарен!

+0

Вы пробовали отладчик? – Shahbaz

+3

Вы должны выделить память для прочитанных строк. –

ответ

4

Вы не можете прочитать произвольный адрес памяти. После выделения памяти структуре студента вам также необходимо выделить память для каждой строки. Грубо говоря:

if(newStudentPtr != NULL) { 
     char buffer[3][256]; 
     fscanf(fp, "%s %s %s", buffer[0], buffer[1], buffer[2]); 
     newStudentPtr->surname = malloc(strlen(buffer[0])+1); 
     strcpy(newStudentPtr->surname, buffer[0]); 
     newStudentPtr->name = /* similar ... */; 
     newStudentPtr->group = /* similar ... */; 
    } 
+0

Была эта идея, но подумал, что это слишком непрактично. Спасибо. – iNfas

1

Вы можете изменить ваш struct student содержать массив символов (вместо символьных указателей);

struct student { 
    char surname[100]; 
    char name[100]; 
    char group[100]; 
}; 
Смежные вопросы