Sortowanie struktury z pliku

0

Cześć! Mam (prawie) napisany program, który jest bazą danych dla filmów. Wykonałem już praktycznie wszystkie pożądane przeze mnie funkcje, jednak nie mogę dojść do rozwiązania problemu z sortowaniem. Wybierając sortowanie po gatunku lub tytule nie dzieje się nic, a gdy odkomentuje sortowanie po dacie to wtedy program się nie skompiluje. Czy ktos ma pomysł w jaki sposób mógłbym "naprawić" te błędy?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 999
struct BazaFilmow
{
    char Tytul[MAX];
    char Gatunek[25];
    int Data_Produkcji;
}DATA;

FILE *lista;
FILE *lista2;
int c;

void dodawanie()
{
    struct BazaFilmow;
    fflush(stdin);
    printf("Podaj Tytul:\n");
    scanf("%*c%[^\n]",DATA.Tytul);
gatunek:
    printf("Podaj Gatunek:\n");
    scanf("%*c%[^\n]",DATA.Gatunek);
    if((strcmp(DATA.Gatunek, "Akcja")== 0) || (strcmp(DATA.Gatunek, "Animacja")== 0) || (strcmp(DATA.Gatunek, "Dokumentalny")== 0) || (strcmp(DATA.Gatunek, "Dramat")== 0) || (strcmp(DATA.Gatunek, "Fantasy")== 0) || (strcmp(DATA.Gatunek, "Horror")== 0) ||
            (strcmp(DATA.Gatunek, "Komedia")== 0) || (strcmp(DATA.Gatunek, "Krotkometrazowy")== 0) || (strcmp(DATA.Gatunek, "Kryminal")== 0) || (strcmp(DATA.Gatunek, "Melodramat")== 0) || (strcmp(DATA.Gatunek, "Niemy")== 0) || (strcmp(DATA.Gatunek, "Przygodowy")== 0) ||
            (strcmp(DATA.Gatunek, "Romans")== 0) || (strcmp(DATA.Gatunek, "Sci-Fi")== 0) || (strcmp(DATA.Gatunek, "Thriller")== 0))
    {}
    else
    {
        printf("Nieznany gatunek, sproboj jeszcze raz:\n");
        goto gatunek;
    }
data:
    fflush(stdin);
    puts("Podaj Date produkcji:");
    scanf("%d",&DATA.Data_Produkcji);
    if(DATA.Data_Produkcji <= 1800)
    {
        printf("Bledna data, sproboj jeszcze raz:\n");
        goto data;
    }
    lista = fopen("lista.txt", "a");
    fprintf(lista, "%s;%s;%d\n", DATA.Tytul, DATA.Gatunek, DATA.Data_Produkcji);
    fclose(lista);
    printf("Pomyslnie dodano film do bazy\n\n");
}

void list()
{
    struct BazaFilmow;
    char trybSortowania;
sortowanie:
    puts("Wybierz tryb sortowania:[T]ytul, [G]atunek, [D]ata\nAby wyswietlic liste nacisnij [W]\nAby wrocic do poczatku wpisz [E]");
    fflush(stdin);
    scanf("%c", &trybSortowania);
    if(trybSortowania == 'T'||'G'||'D')
    {
        switch(trybSortowania)
        {
        case 'T':
            sortTytul();
            goto sortowanie;
            break;
        case 'G':
            sortGatunek();
            goto sortowanie;
            break;
        case 'D':
            sortRok();
            goto sortowanie;
            break;
        case 'E':
            system("cls");
            return 0;
        case 'W':
            system("cls");
            wyswietl();
            break;
        default:
            printf("Nieznany tryb sortowania\n");
            goto sortowanie;

        }
    }
}

void sortTytul()
{
    struct BazaFilmow;
    int i=0,j=0,n;
    char schowek[MAX];
    lista = fopen("lista.txt", "r");
    fscanf(lista,"%s%[^;]%s%[^;]%d", DATA.Tytul, DATA.Gatunek, DATA.Data_Produkcji);
    lista2 = fopen("wyjscie.txt", "a");
    for(i=0; i<n-1; i++)
    {
        for(j=i+1; j<n; j++)
            if(strcmp(DATA.Tytul[i],DATA.Tytul[j+1])>0)
            {
                strcpy(schowek,DATA.Tytul[i]);
                strcpy(DATA.Tytul[i],DATA.Tytul[j]);
                strcpy(DATA.Tytul[j],schowek);
            }
    }
    fprintf(lista2, "%s\t\t\t\t\t\t%s\t\t\t%d\n",DATA.Tytul[j], DATA.Gatunek, DATA.Data_Produkcji);
    puts("Sortowanie pomyslne");
    fclose(lista);
    fclose(lista2);

}


void sortGatunek()
{
    struct BazaFilmow;
    int i=0,j=0,n;
    char schowek[MAX];
    lista = fopen("lista.txt", "r");
    fscanf(lista,"%s%[^;]%s%[^;]%d", DATA.Tytul, DATA.Gatunek, DATA.Data_Produkcji);
    lista2 = fopen("wyjscie.txt", "a");
    for(i=0; i<n-1; i++)
    {
        for(j=i+1; j<n; j++)
            if(strcmp(DATA.Gatunek[i],DATA.Gatunek[j+1])>0)
            {
                strcpy(schowek,DATA.Gatunek[i]);
                strcpy(DATA.Gatunek[i],DATA.Gatunek[j]);
                strcpy(DATA.Gatunek[j],schowek);
            }
    }
    fprintf(lista2, "%s\t\t\t\t\t\t%s\t\t\t%d\n",DATA.Tytul, DATA.Gatunek[j], DATA.Data_Produkcji);
    puts("Sortowanie pomyslne");
    fclose(lista);
    fclose(lista2);

}

void sortRok()
{
    struct BazaFilmow;
    int i=0,j=0,n;
    int schowek[MAX];
    lista = fopen("lista.txt", "r");
    fscanf(lista,"%s%[^;]%s%[^;]%d", DATA.Tytul, DATA.Gatunek, DATA.Data_Produkcji);
    lista2 = fopen("wyjscie.txt", "a");
    for(i=0; i<n-1; i++)
    {
        for(j=i+1; j<n; j++)
            if(DATA.Gatunek[i]>DATA.Gatunek[j+1])
            {
                schowek=DATA.Data_Produkcji[i];
                DATA.Data_Produkcji[i]=DATA.Data_Produkcji[j];
                DATA.Data_Produkcji[j]=schowek;
            }
    }
    fprintf(lista2, "%s\t\t\t\t\t\t%s\t\t\t%d\n",DATA.Tytul, DATA.Gatunek, DATA.Data_Produkcji[j]);
    puts("Sortowanie pomyslne");
    fclose(lista);
    fclose(lista2);

}

void wyswietl()
{
    lista2 = fopen("wyjscie.txt", "r");
    puts("Tytul filmu:\t\t\t\t\tGatunek:\t\tRok produkcji:\n");
    if(lista)
    {
        while ((c = getc(lista2)) != EOF)
            putchar(c);
    }
    fclose(lista2);
}


int main()
{
    char komenda[6];
    printf("Witaj w Bazie filmow.\n");
poczatek:
    puts("\nAby przejsc do listy filmow wpisz /lista.\nAby dodac film do bazy wpisz /dodaj.\nAby wyjsc z programu wpisz /exit");
    printf("\nPodaj komende:\n");
    fflush(stdin);
    scanf("%s",komenda);
    if(strcmp(komenda,"/dodaj")== 0)
    {
        system("cls");
        dodawanie();
    }

    else if(strcmp(komenda,"/lista")== 0)
    {
        system("cls");
        list();
    }
    else if(strcmp(komenda,"/exit")== 0)
    {
        exit(1);
    }
    else
    {
        puts("Nieznana komenda");
    }
    goto poczatek;

    return 0;
}

0

Edit: nie, jednak się poddaje, nie rozumiem co to za struktura ta DATA.

0

Wybierając sortowanie po gatunku lub tytule nie dzieje się nic

A co ma się dziać, jeśli te funkcje nie sortują, tylko wczytują pierwszy rekord z pliku, coś tam dziwnego z nim robią i zapisują do innego pliku? Zrób to po ludzku i wczytaj całą bazę do pamięci i posortuj ją funkcją qsort.

1 użytkowników online, w tym zalogowanych: 0, gości: 1