zam
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Большое Спасибо за идеи, в структурах я совсем новичек, подскажите, почему вылетает с ошибкой, когда хочу прочитать файл с оценками (+к фамилиям?)? Хочу отсортировать по баллу, вот файл: Maksim 55 Anton 44 Vova 33 Mihail 22 Закомментированный код - это мое видение чтения файла с оценками, но он не работает. Объясните, что я не правильно понял. Код: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> typedef struct{ char* fio; char* address; char* phone; char* marks; }student, *pstudent; typedef struct{ pstudent students; int size; } studentArray, *pstudentArray; void initStudentArray(pstudentArray sa){ sa->students=NULL; sa->size=0; } void addStudentToArray(pstudentArray sa,pstudent ps){ sa->size++; sa->students = (pstudent)realloc(sa->students,sizeof(student)*sa->size); *(sa->students+sa->size-1)=*ps; } void freeStudentArray(pstudentArray sa){ int i; for(i=0;i<sa->size;i++) free(sa->students[i].fio); /* for(i=0;i<sa->size;i++) free(sa->students[i].marks); */ free(sa->students); initStudentArray(sa); } void printStudentArray(studentArray sa){ int i; for(i=0;i<sa.size;i++) puts(sa.students[i].fio); } /*void printStudentArrayMarks(studentArray sa){ int i; for(i=0;i<sa.size;i++) puts(sa.students[i].marks); } */ int ReadFromFileFio(pstudentArray sa,FILE *from) { char tempStr[1024]; int len; char *st; pstudent newStudent; newStudent = (pstudent)malloc(sizeof(student)); if(feof(from)) return 0; st = fgets(tempStr,1023,from); len = strlen(tempStr); if(st==NULL) return 0; if(tempStr[len-1]==10) tempStr[len-1]=0; newStudent->fio = (char*)malloc(len+1); strcpy(newStudent->fio,tempStr); addStudentToArray(sa,newStudent); return 1; } /*int ReadFromFileMarks(pstudentArray sa,FILE *from) { char tempStr[1024]; int len; char *st; pstudent newStudent; newStudent = (pstudent)malloc(sizeof(student)); if(feof(from)) return 0; st = fgets(tempStr,1023,from); len = strlen(tempStr); if(st==NULL) return 0; if(tempStr[len-1]==10) tempStr[len-1]=0; newStudent->marks = (char*)malloc(len+1); strcpy(newStudent->marks,tempStr); addStudentToArray(sa,newStudent); return 1; } */ int fcmpStudentName(const void *src, const void *dst) { return strcmp( ((pstudent)(src))->fio,((pstudent)(dst))->fio); } /*int fcmpStudentMarks(const void *src, const void *dst) { return strcmp( ((pstudent)(src))->marks,((pstudent)(dst))->marks); } */ int main(void) { FILE *file; char ch; int d=1; studentArray sa; clrscr(); printf("0. Прочитать файл\n1. Сортировка по фамилии\n2. Сортировка по среднему баллу\nДля выхода нажмите ESC\n\n\n"); initStudentArray(&sa); file = fopen("students.dat","r"); if(file==NULL) { printf("Файл не найден\n"); getch(); return 1; } while(d) { d = ReadFromFileFio(&sa,file); /* d = ReadFromFileMarks(&sa,file);*/ } fclose(file); do { ch = getch(); switch(ch) { case '0': clrscr(); printStudentArray(sa); printf("\n\n0. Прочитать файл\n1. Сортировка по фамилии\n2. Сортировка по среднему баллу\nДля выхода нажмите ESC\n\n\n"); break; case '1': clrscr(); qsort(sa.students,sa.size,sizeof(student),&fcmpStudentName); printStudentArray(sa); printf("\n\n0. Прочитать файл\n1. Сортировка по фамилии\n2. Сортировка по среднему баллу\nДля выхода нажмите ESC\n\n\n"); break; case '2': // qsort(sa.students,sa.size,sizeof(student),&fcmpStudentMarks); break; case 'q': exit(1); } } while (ch!=0x1b); /* printStudentArrayMarks(sa);*/ freeStudentArray(&sa); return 0; } | Добавлено И как мне в контексте использования вашей структуры загнать строку оценок: 454545454445 и посчитать ее средний бал и использовать этот средний бал в привязке в вышеобозначенному студенту? | Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 01:26 15-05-2003 | Исправлено: zam, 03:08 15-05-2003 |
|