Sortieren einer Binär Datei



  • Hallo Leute,

    ich habe folgendes Problem. Ich soll ein C-Programm schreiben dass eine Datei (Buecher.dat) einliest und dann wahlweise absteigend oder aufsteigend sortiert nach dem Gesamtpreis oder der Anzahl der bestellten Exemplare.

    Nun, ich kenne da kaum eine Methode. Nur Bubblesort und damit komme ich auch nicht klar. Vielleicht kann mir einer von euch helfen. Das wäre echt super!

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct 	Buecher
    {
    	char 	Besteller[21];
    	char 	KundenNr[11];
    	char 	Ort[11];
    	char 	KTitel[16];
    	char 	Autor[21];
    	char 	Verlag[21];
    	char 	ISBN[14];
    	short 	Anzahl;
    	float 	Preis;
    }__attribute__ ((packed)) adr;
    
    int main() {
        int c;
        int count=0;
        FILE* Buech;
        char key;
    
        if ((Buech = fopen("Buecher.dat", "r")) == NULL)
        {
        printf("Datei konnte nicht geoeffnet werde.\n");
        getchar();
        exit(-1);
        }
    
        do{
        printf("(B)eenden\n");
        printf("(U)nsortiert Anzeigen\n");
    
        key=getchar();
        fflush(stdin);
    
        switch(key) {
                    case 'U':
                         while (fread(&adr, sizeof(adr),1, Buech) == 1) {
                         printf("\nBesteller: \t%s", adr.Besteller);
                         printf("\nKundenNr: \t%s", adr.KundenNr);
                         printf("\nOrt: \t\t%s", adr.Ort);
                         printf("\nKTitel: \t%s", adr.KTitel);
                         printf("\nAutor: \t\t%s", adr.Autor);
                         printf("\nVerlag: \t%s", adr.Verlag);
                         printf("\nISBN: \t\t%s", adr.ISBN);
                         printf("\nAnzahl: \t%d", adr.Anzahl);
                         printf("\nPreis: \t\t%f\n", adr.Preis);
                         getchar();
                         }
                    }
        }                          
    
        while(key != 'B');
        fclose(Buech); 
    }
    


  • Hallo,

    dann zieh dir das mal rein: http://www.sortieralgorithmen.de/

    Schnuppertipps: Quicksort, Mergesort, ShellSort, Insertion Sort

    Mfg

    GPC



  • Also ich würde ja den einfachen Weg gehen und den qsort() aus der stdlib nehmen.



  • Ich werd mal den Link durchgehen. Hoffe ja das ich zurecht komm.



  • Hallo nochmal...

    Leider komme ich überhaupt nicht zurecht. Das liegt wohl darin das C einfach nicht mein Ding ist. Könntet Ihr vielleicht weitere Anregungen geben?



  • Also ich würde ja den einfachen Weg gehen und den qsort() aus der stdlib nehmen.



  • Und wie baue ich das ein? Sorry für meine dummheit.



  • Du liesst alle Datensätze der Datei in ein Array (das natürlich ausreichend groß ist). z.B. mit fread().
    Dann schreibst du eine Vergleichsfunktion wie sie der qsort() fordert. Diese übergibst du dann dem qsort() selbst welcher dann das array sortiert, und dann kannst du das Array wieder in die Datei schreiben.

    Nette Links:
    http://www.die.net/doc/linux/man/man3/malloc.3.html
    http://www.die.net/doc/linux/man/man3/qsort.3.html
    http://c-faq.com/lib/qsort2.html
    http://www.pronix.de/pronix-833.html (siehe 24.3.6 qsort() )

    PS: qsort() ist auch nicht ganz ohne, aber du ersparst dir das Implementieren eines eigenen Algos. Googlen für den qsort() wäre auch keine schlechte Idee. Ein Tutorial oder Buch sogar noch viel besser.

    PPS: Mit Dummheit hat das nichts zu tun. Musst dich halt anstrengen.



  • Recht vielen Dank. Das werde ich morgen alles durcharbeiten. Ich denke es ist heute zu spät um noch was in meinen verwirrten Kopf zubekommen.

    Ich werde dann mal mein Ergebniss posten.


Anmelden zum Antworten