🎾Практика. Бинарный файл, компаратор

#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