Dateien sortieren mit C



  • Schönen guten abend ... so ich bin nun schon ne ganze weile lang am verzweifeln ... was ich machen möchte ... ich habe ein verzeichniss in dem befinden sich dateien die so aussehen beleg1.dat beleg2.dat beleg3.dat usw., meine frage ist nun wie ich das hin bekomme die daten mit c sortiert einzulesen also nicht das sowas rauskommt

    beleg1.dat
    beleg10.dat
    beleg11.dat
    ....
    beleg2.dat
    beleg20.dat
    ....
    beleg3.dat
    ....

    sondern alles in einer vernünftigen reihenfolge ist ...

    Über eine anregung zur ner lösung würde ich mich extrem freuen

    MFG Andre





  • ok gut das hatte ich schonmal. Also vielleicht ein bischen genauer ...

    wenn ich das ganze verzeichniss auslesen lasse dann bekomme ich eine liste ... diese ist einfach verkettet und selbstgeschrieben

    ein element besteht aus

    struct LISTELEMENT {
    char *value;
    struct LISTELEMENT *next;
    }
    

    wie kann ich das qsort so geben ? ich hatte auch schon alles in ein char array geworfen und dann auf qsort geschickt aber leider habe ich da nich so eine richtige idee wie ich das anstellen soll das der am ende das nach den zahlen sortiert ...



  • qsort erwartet ein Array. Für eine verkettete Liste musst du dir selbst einen Sortier-Algorithmus schreiben



  • erst alle 'struct LISTELEMENTS in ein array packen, und dann etwa so:

    int comparefunc (void * a, void * b)
    {
      struct LISTELEMENT *p1 = a;
      struct LISTELEMENT *p2 = b;
    
      // hier p1->value mit p2-value vergleichen
      // und rückgabe -1(kleiner), 0(gleich), oder 1(groesser)
      ...
      ...
    }
    
    ...
    qsort (pointer_auf_erstes_listelement_im_array, 
           anzahl_der_listelemente_im_array, 
           sizeof(struct LISTELEMENT),
           comparefunc);
    ...
    

    qsort schaufelt dann das array um...
    🙂



  • hm ja ... naja mal schauen ich bin schon den ganzen tag am grübeln wie ich das mache wird schon noch was einfallen ... trotzdem danke



  • Würden die Dateien beleg01.dat, beleg02.dat, ... heißen,
    wäre es einfacher.

    Ansonsten mußt du in deinem Comparator, mühsam den Dateinamen
    nach der Ziffernfolge auseinanderfriemeln.

    Auch würde das, wenn es im Comparator geschieht,
    bei jedem einzelnen Vergleich immer und immer wieder
    ausgeführt werden müssen.

    Effizienter ist es dann eine eigene kleine struct
    zu definieren

    struct {
      const char *filename;
      int number;
    }
    

    und die Nummern für jeden Dateinamen nur einmal
    zu bestimmen; dann könnte deine compare-Funktion
    dann ganz einfachen nach number vergleichen.



  • Hey leutz ... vielen dank für die Antworten ... die Lösung mit dem QSort finde ich wirklich sehr interessant ... werde ich auch mal ausprobieren ... habe das ganze problem jetzt anders gelösst ... ich mache mir es da vielleicht auch ein wenig zu einfach ...

    Meine Lösung:
    ------------
    als erstes gehe ich meine liste durch und lasse alles zerlegen per strtok ... dort ziehe ich mir die nummern raus ... das geht aber alles nur unter der vorraussetzung das die dateinamen immer so aussehen und im pfad sowas nicht vorkommt ... egal ... jo dann speicher ich mir dazu noch die zeile ab in der der eintrag steht

    dannach nehme ich mir ein counter gehe die liste mit den zahlen und zeilen durch ... habe ich eine übereinstimmung dann füge ich das element aus meiner pfadliste auf eine neue liste hinzu (ich weis dann natürlich wo das element steht da ich ja die zeile vorher abgespeichert habe)

    .... so und nur zum verständniss für qsort

    ich packe alle meine elemente in ein array rein ... qsort übergebe ich dann eine funktion, wo ich das was ich haben will miteinander vergleiche .... je nachdem gebe ich dann -1 für kleiner 0 für gleich und 1 für größer zurück ... am ende muss ich dann aus meinem sortiertes array wieder eine liste machen (da ja die addressen am ende vollkommen vertauscht sind) ... seh ich das richtig so ?



  • Andre Schaaf schrieb:

    Meine Lösung:
    ------------
    ...
    ich mache mir es da vielleicht auch ein wenig zu einfach ...

    eher zu kompliziert 😉

    Andre Schaaf schrieb:

    .... so und nur zum verständniss für qsort
    ich packe alle meine elemente in ein array rein ... qsort übergebe ich dann eine funktion, wo ich das was ich haben will miteinander vergleiche .... je nachdem gebe ich dann -1 für kleiner 0 für gleich und 1 für größer zurück ... am ende muss ich dann aus meinem sortiertes array wieder eine liste machen (da ja die addressen am ende vollkommen vertauscht sind) ... seh ich das richtig so ?

    stimmt, aber wenn du gleich die liste sortieren willst (was wesentlich schneller geht als arrays durchzumischen, wie qsort das macht): http://alumnus.caltech.edu/~pje/llmsort.html



  • Vielen dank für diesen Tip das ist ein wirklich sehr guter Algorithmus ... ich denke viel schneller geht es fast nicht

    Besten Dank


Anmelden zum Antworten