2015-05-06 3 views
0

Линия, прокомментированная в createStructs(), дает мне ошибку. Я пытаюсь выполнить сканирование в списке информации из текстового файла, и это приводит к сбою программы после загрузки файла. Когда он выходит из строя, он выгружает выход, но по-настоящему странным образом. Вот мой код:C Программирование structs runtime error

#define MAX 71 
#define SIZE 14 

typedef struct { 
    char first[7]; 
    char initial[1]; 
    char last[9]; 
    char street[16]; 
    char city[11]; 
    char state[2]; 
    int zipcode[5]; 
    int age; 
    char sex[1]; 
    int tenure; 
    double salary; 
} Employee; 
    insert main method just calling the functions 
    void strsub(char buf[], char sub[], int start, int end) { 
    int i, j = 0; 

    for (j = 0, i = start; i <= end; i++, j++) { 
     sub[j] = buf[i]; 
    } 
    sub[j] = '\0'; 
} 

void createStructs(Employee inWorkers[]) { 
    int i = 0; 
    char buf[MAX]; 
    char temp[SIZE]; 
    if (!(fp = fopen("payfile.txt", "r"))) { 
     printf("payfile.txt could not be opened for input."); 
     exit(1); 
    } 

    while (!(feof(fp))) { 
     fgets(buf, MAX, fp); 
     strsub(buf, inWorkers[i].first, 0, 6); 
     strsub(buf, inWorkers[i].initial, 8, 8); 
     strsub(buf, inWorkers[i].last, 10, 18); 
     strsub(buf, inWorkers[i].street, 20, 35); 
     strsub(buf, inWorkers[i].city, 37, 47); 
     strsub(buf, inWorkers[i].state, 49, 50); 
     strsub(buf, temp, 52, 56); 
     //inWorkers[i].zipcode = atoi(temp); 
     strsub(buf, temp, 58, 59); 
     inWorkers[i].age = atoi(temp); 
     strsub(buf, inWorkers[i].sex, 61, 61); 
     strsub(buf, temp, 63, 63); 
     inWorkers[i].tenure = atoi(temp); 
     strsub(buf, temp, 65, 70); 
     inWorkers[i].salary = atof(temp); 
     i++; 
    } 
} 

void printNames(Employee workers[]) { 
    for (int i = 0; i < SIZE; i++) { 
     printf("%s %s %s %s %s %s %d %d %s %d %.2lf", workers[i].first, workers[i].initial, workers[i].last, 
      workers[i].street, workers[i].city, workers[i].state, workers[i].zipcode, workers[i].age, 
      workers[i].sex, workers[i].tenure, workers[i].salary); 
    } 
} 
+1

Изменить 'int zipcode [5];' to 'int zipcode;' (если вам действительно не нужно 5 zipcodes на сотрудника). Вам также нужно объявить 'FILE * fp = NULL;' перед тем, как вы попытаетесь «fopen». И посмотреть [** Почему «в то время как (! Feof (файл))» всегда так? **] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

ответ

1

Ваша проблема заключается в том, что вы создаете массив целых чисел (int zipcode[5]). Затем вы пытаетесь передать inworkers[i].zipcode результат вызова atoi. В результате вы назначаете целочисленное значение целочисленному указателю.

Я был бы очень удивлен, если вы не получите предупреждения во время компиляции. Вы действительно должны скомпилировать с -Wall и разрешить все предупреждения в качестве первого шага.

Вместо того, чтобы создавать это массив целых чисел, почему бы просто не назвать его целочисленным значением?