Работа с бинарными файлами. Вывод на экран - C (СИ)
Формулировка задачи:
В бинарном файле у меня 3 записи структуры:
a a 5
a a 4
a a 6
Однако сортирует и выводит на экран 9 записей:
a a 4
a a 4
a a 4
a a 5
a a 5
a a 5
a a 6
a a 6
a a 6
Вот код
#include <locale.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <math.h> typedef struct { char name[16]; char type[6]; unsigned int kurs; } STUDENT; int Cmp(const void *,const void *); int main(int argc, char *argv[]) { setlocale(LC_ALL, ""); FILE *f = NULL; if ((f = fopen("data.bin", "rb")) == NULL) { puts("Невозможно открыть файл!"); return 0; } fseek(f, 0, SEEK_END); int num = ftell(f); fseek(f, 0, SEEK_SET); if (num % sizeof(STUDENT)) { puts("Некорректный файл!"); fclose(f); return 0; } num /= sizeof(STUDENT); STUDENT *array = (STUDENT *)calloc(num, sizeof(STUDENT)); if (!array) { puts("Не хватает памяти!"); fclose(f); return 0; } fread(array, sizeof(STUDENT), num, f); fclose(f); f = fopen("data.bin", "wb"); if (f == NULL) { puts("Невозможно создать файл!"); free(array); return 0; } qsort(array,num,sizeof(STUDENT),Cmp); fwrite(array, sizeof(STUDENT), num, f); fclose(f); f = fopen("data.bin", "rb"); for (int i = 0; i < num; i++) { STUDENT fl; fread(&fl, sizeof(STUDENT), 1, f); printf("%s %s %d\n", fl.name, fl.type, fl.kurs); } fclose(f); free(array); return 0; } int Cmp(const void *el1, const void *el2) { STUDENT *ptr1 = (STUDENT *)el1, *ptr2 = (STUDENT *)el2; if(ptr1->kurs > ptr2->kurs) return 1; else if(ptr1->kurs < ptr2->kurs) return -1; return 0; }
Решение задачи: «Работа с бинарными файлами. Вывод на экран»
textual
Листинг программы
num /= sizeof(STUDENT);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д