Практика. Бинарный файл, компаратор
#include <iostream>
#include <string.h>
struct Book
{
char name[40];
int mark[3];
int group;
};
void init_file(int n);
void sort_book(int n, bool(*foo)(Book a, Book b));
bool compare_books_by_rank(Book a, Book b);
bool compare_books_by_price(Book a, Book b);
bool compare_books_by_name(Book a, Book b);
int main()
{
FILE* f = fopen("testcmp.br","wb");
fclose(f);
init_file(3);
getchar();
sort_book(3, compare_books_by_name);
Book books[3];
f = fopen("testcmp.br","rb");
fread(books, 3, sizeof(Book), f);
for(int i = 0; i < 3; i++)
printf("%s\n", books[i].name);
}
void init_file(int n)
{
FILE* f = fopen("testcmp.br", "wb");
n = 3;
struct Book book[3];
for(int i = 0; i < n; i++)
{
scanf("%s%d%d%d%d", book[i].name, &book[i].group, book[i].mark, book[i].mark + 1, book[i].mark + 2);
printf("%s\n%d\n%d %d %d\n", book[i].name, book[i].group, book[i].mark[0], book[i].mark[1], book[i].mark[2]);
}
fwrite(book, 3, sizeof(Book), f);
fclose(f);
}
void sort_book(int n, bool(*foo)(Book a, Book b))
{
FILE* f = fopen("testcmp.br", "rb+");
for(int k = 0; k < 3; k++)
{
for(int i = 0; i < n - 1; i++)
{
fseek(f, i * sizeof(Book), SEEK_SET);
Book book1;
fread(&book1, sizeof (Book), 1, f);
for(int j = i + 1; j < n; j++)
{
fseek(f, j * sizeof(Book), SEEK_SET);
Book book2;
fread(&book2, sizeof (Book), 1, f);
if(foo(book1, book2))
{
fseek(f, i * sizeof(Book), SEEK_SET);
fwrite(&book2, sizeof (Book), 1, f);
fseek(f, j * sizeof(Book), SEEK_SET);
fwrite(&book1, sizeof (Book), 1, f);
break;
}
}
}
}
fclose(f);
}
bool compare_books_by_name(Book a, Book b)
{
return strcmp(a.name, b.name) > 0 ? 1 : 0;
}
bool compare_books_by_price(Book a, Book b)
{
return a.mark[0] + a.mark[1] + a.mark[2] > b.mark[0] + b.mark[1] + b.mark[2];
}
bool compare_books_by_rank(Book a, Book b)
{
return a.group < b.group;
}
//german
//2
//3 3 3
//alena
//3
//4 4 4
//dima
//4
//5 5 5
Last updated