[c] Dateiliste sortieren, mehrdimensionale Felder über malloc?

Wu-mc

Mitglied
Hallo Forum,

es nimmt kein Ende, was selbst bei kleinen Projekten für Probleme auftauchen können. Also folgendes, ich muss Dateien einlesen und den Inhalt an eine große Datei anhängen. Soweit so Schwierig. Nur müssen diese in der richtigen Reihenfolge, also nach Alphabet sortiert, eingelesen werden. FindFirstFile und FindNextFile gehen ja nicht nach dem Alphabet vor. Deshalb dachte ich jetzt ich lese mit den zwei Funktionen alle Dateinamen in ein 2 Dimensionales Array ein, sortiere dieses Array nach dem Alphabet und gehe dann so eine Datei nach der anderen durch.

So, mit malloc kenne ich mich nur oberflächlich aus (habs schonmal benutzt aber nur mäßig verstanden) und jetzt soll ich das ganze noch für 2D Arrays verwenden? Wobei ich eigentlich sicher weiß das der Dateinamen, also der zweite Teil des Arrays, 13 Zeichen inkl. NUL lang ist. Jedoch bringt mich das auch noch nicht wirklich weiter, da ja der erste Teil des Arrays ja noch variabel je nach Anzahl Dateien ist.

Habe schon Beispiele hier im Forum gesehen um auf Mehrdimensionale Arrays mit malloc zu allozieren, allerdings hat mich das nicht weiter gebracht.

Wenn ich jetzt zuerst mal mit FindFirstFile und FindNextFile alle Dateien des Ordners durchgehen würde und dabei einen Index hochzähle hätte ich ja schonmal die Anzahl der Elemente. Oder gibt es da einfachere Funktionen die Anzahl der Dateien eines Ordners abzufragen?
Und wie mach ich dann weiter? Damit hätte ich ja meine zwei Größen für das Array, aber halt erst während der Laufzeit.

Für Hilfe bin ich sehr dankbar!
 
Zum einen gibt es noch die Funktion "realloc" mit der Du theoretisch Dein Array jedesmal wieder neu verlängern kannst, jedoch nur mit Geschwindigkeitseinbußen, wie Du Dir denken kannst.

Ansonsten musst Du ja nicht gleich alles auf einmal speichern.
Du könntest auch erst alle Verzeichnisse in einer Liste speichern.
Diese dann schön sortieren, und dann erst die einzelnen Verzeichnisse einzeln wieder "ansteuern" und die Dateinamen speichern, sortieren und in deine Datei eintragen.

Hab ich das so richtig verstanden?
 
Ähm, ne nicht ganz. Aber ich versuchs einfach noch mal, vielleicht war meine Erklärung nicht klar.

Ich habe einen Ordner, in dem liegen mehrere *.txt Dateien. Jetzt soll aus jeder Datei der Inhalt ausgelesen werden und an eine große *.txt Datei angehängt werden. Also das in einer Datei dann der ganze Inhalt, der vorher in vielen kleinen Stand, steht. Nur ist es halt wichtig das die einzelnen *.txt Dateien alphabetisch eingelesen werden.

Also hier mal ein beispiel:

Dateiname: 200.txt

hallo

Dateiname: 201.txt

welt

---

Ausgabe in der neuen Datei:

Dateiname: inhalt.txt

hallo
welt

---

hoffe ich konnte das Problem klar machen.
 
Hi.

Ich denke am einfachsten wäre eine (doppelt) verkettete Liste mit sortierter Einfügung zu benutzen. Eine Liste ist für so eine dynamische Datenstruktur mit unbekannter Anzahl von Elementen ziemlich gut geeignet.

Mußt du das eigentlich unbedingt in C schreiben? Bei C++ bekommt man solche Datenstrukturen frei Haus.

Gruß
 
es bauen halt einige Sachen auf C auf, aber ich werde das jetzt mal überprüfen. Da ich in C++ schon einiges gefunden habe wie z.B. CStringArray mit dem das recht hübsch zu lösen wäre.

Muss eigentlich an einer Window Prozedur (WinAPI) arg viel umgebaut werden von C auf C++?
 
Zuletzt bearbeitet:
Okay ich hab grad mal kurz rein geschaut, das kann ich vergessen. Ist viel zu aufwendig das ganze in C++ um zu schreiben.

Kannst du mir das mit den doppelt verketteten listen kurz erklären. Werde auch gleich mal meine Unterlagen rausziehen, aber wir haben nur mal einfache gemacht und auch nur von der theorie her besprochen, nie programmiert.

Und vor allem brauch ich da ja auch malloc, wie benutz ich das da dann?

EDIT: Kann ich mit malloc nicht einfach ein Array anlegen mit

Dateinamenliste [ Anzahl der Dateien ] [ Länge der Dateinamen ]

den beide Parameter lassen sich zur Laufzeit erfahren und ändern sich dann ja auch nicht mehr da die Funktion am Ende des Programms einmal ausgeführt wird und das Ende des Programms ist nur einmal am Tag.
 
Zuletzt bearbeitet:
Habs jetzt hinbekommen die Dateinamen einzulesen.

Ich frage zuerst die Anzahl der Dateien ab. Die Dateinamenlänge weiß ich ja, so kann ich dann wie folgt meinen Speicherbereich belegen:

pszFileNames = (TCHAR *) malloc (iCountFiles * iFileNameLen * sizeof (TCHAR));

Kann mir jetzt jemand auf die Schnelle sagen wie ich meine Dateinamen sortiere? Also nur damit ich das Rad nicht neu erfinden muss. :)
 
Bei Spotlight hat mir jemand geraten einfach ne "vituelle" ListBox mit DlgDirList zu erzeugen und die dann einen nach dem anderen abzufragen. Irgendwie gefällt mir diese Lösung nicht, obwohl sie wohl einfacher zu realisieren ist als jetzt noch Quicksort zu machen. Was meint ihr, welche Möglichkeit ist die bessere? evtl. Begründung?
 
In der STDLIB.H sollte diese Funktion enthalten sein:

Code:
void qsort(void *feld, size_t n, size_t groesse, int (*comp) (const void *empt1, const void *empt2));
qsort sortiert ein Array feld bis feld von Objekten der Größe groesse in aufsteigender Reihenfolge (Quick Sort).

 
Zurück