Helft mit Bitte! Probleme mit Sortieren :(



  • Hi @ all

    ..bin gerade dabei c zu lernen..also noch so ziemlich am anfang

    Habe folgendes Problem gestellt bekommen:

    Ziel des Programmes ist das Bearbeiten von ASCII-Text-Dateien. Die vorgegebene Datei hat den Dateinamen "PERSONEN.TXT" und enthält eine Menge von Nachnamen und Geburtsdaten. Der Dateiaufbau entspricht folgendem Muster:
    Altermann 23.12.1947
    Brauer 08.01.2000 u.s.w.
    Aufgaben:

    1. Anzeige der Datei auf dem Bildschirm, ohne die Formatierung zu verändern. (>>schon gemacht)

    2. Erzeugen einer neuen Datei mit dem Namen "GEORDNET.TXT". Diese Datei soll die Namen (+ Geburtsdaten) in alphabetischer Reihenfolge enthalten.

    ... mit Mühe und Not hab ich den ersten teil der aufgabe hinbekommen. wie folgt:

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

    void main(void)
    {
    int i,c;
    char name[100];

    FILE *dateizeiger;

    printf("Bitte Geben Sie den Pfad Ihrer Datei An (z.B. c:\\bla.txt) : ");scanf("%s",name);
    if ((dateizeiger = fopen(name,"r")) == NULL)
    {
    printf("Datei kann nicht zum Lesen geöffnet werden! Existiert Nicht\n");
    exit(-2);
    }

    while (fscanf(dateizeiger,"%c",&i) != EOF)
    printf("%c",i);
    fclose(dateizeiger);

    funzt auch soweit =)...nur bei der zweiten aufgabe ( sortieren ) ..gerat ich an meine grenzen

    ich muss doch den datensatz aus der datei in ein feld stopfen um damit arbeiten zu können? oder?..und wenn ja wie?..und wie sortier ich das am einfachsten?..bin echt am verzweifeln
    wenn mir hier einer helfen könnte wär echt lieb...
    danke in voraus

    mfg snoop



  • Ich würde dir qsort oder (noch besser) std::sort (falls C++ auch geht) empfehlen 😉



  • Du sagtest ja C. Ist zwar das falsche Forum aber trotzdem ein Beispiel...

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    /* Strings vergleichen */
    int compare(const void* str1, const void* str2) {
      return _stricmp((char*)str1, (char*)str2);
    }
    
    int main(int argc, char** argv) {
       int i;
    
       /* Sortieren der Liste */
       qsort((void*)argv, argc, sizeof(char*), compare);
    
       /* Ausgeben der Liste */
       for(i = 0; i < argc; ++i)
          printf("%s \n", argv[i]);
    
       return 0;
    }
    

    EDIT: Ich hoffe das ist jetzt ziemlich standardkonformes C 😉

    [ Dieser Beitrag wurde am 02.06.2003 um 18:15 Uhr von MaSTaH editiert. ]



  • Hey danke Mastah 🙂

    ..aber ich steig da net durch 😞 ..ich hab ja die daten in einer datei stehen..um sie zu sortieren muss ich sie ja erst in die sogenannte liste bekommen..weisst du wie das geht?..brauch das bis morgen und bin echt schon am abkacken hier :p

    ..also das ich die datei öffne mit (fopen) dann ausles...und sie dann in eine liste steck..die ich dann mit qsort sortieren kann



  • Also ein char** ist ein Pointer auf ein Feld von char* welche wiederum auf ein Feld von char (also strings) zeigen...

    Du musst das quasi noch so umbauen, dass du dir das Feld von char* erstellst und dann jedem char* einen String zuweist welchen du wiederrum jeweils aus der Datei liest (am besten mit fgets). Dann machst du qsort und am Ende eine Schleife mit der du das ganze in die Zieldatei schreibst (am besten mit fputs). Hab jetzt leider nicht so viel Zeit dir ne komplette Lösung zu präsentieren aber am besten wird sein du probierst etwas aus und der nächste Mod der hier rein schaut verschiebt dich nach ANSI C 🙂 .



  • Hmmm, habs doch noch gebastelt. Ist aber nicht getestet: 🙂

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    #define MAX_STRINGS 1000 /* maximale Zeilenanzahl in der Datei */
    
    /* Strings vergleichen */
    int compare(const void* str1, const void* str2) {
      return _stricmp((char*)str1, (char*)str2);
    }
    
    int main() {
        int i;
        char **pStrings, **pTemp, *pC;
        FILE *file; 
    
        /* Einlesen der Datei */
        if((file = fopen("C:\\input.txt","r")) == 0) {
            printf("Datei kann nicht zum Lesen geöffnet werden!\n"); 
            return 0;
        }
        pStrings = malloc(sizeof(char*) * MAX_STRINGS);
        pTemp = pStrings;
        while(pC = fgets(file))
            *pTemp++ = pC;
        *pTemp = 0;
        fclose(file);
    
        /* Sortieren der Liste */
        qsort((void*)pStrings, (size_t)(pTemp-pStrings), sizeof(char*), compare);
    
        /* Schreiben der Datei */
        if((file = fopen("C:\\output.txt","w")) == 0) {
            printf("Datei kann nicht zum Schreiben geöffnet werden!\n"); 
            return 0;
        }
        pTemp = pStrings;
        while(pTemp)
            fputs(*pTemp++);
    
        /* Freigeben des Speichers und schließen der Datei */
        free(pStrings);
        fclose(file);
    
        return 0;
    }
    

    Aber mal so gesagt in C++ wär das alles viiiiel einfacher... 😉

    [ Dieser Beitrag wurde am 02.06.2003 um 18:56 Uhr von MaSTaH editiert. ]



  • Sortieralgorithmen

    Oder Google mal nach Quicksort, Insertsort, Selectsort, Mergesort, Bubblesort,
    Heapsort, Shellsort oder Radixsort.

    [ Dieser Beitrag wurde am 03.06.2003 um 07:34 Uhr von C Newbie editiert. ]


Anmelden zum Antworten