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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы