Работа с бинарными файлами. Вывод на экран - 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);