Alle Dateien im Verzeichnis in Array speichern /generelle Frage zu 2-dimensionalem Array
-
Ich möchte alle Dateien im Verzeichnis auflisten, da bietet sich ja grundsätzlich ein Array an und nicht für jede Datei eine eigene char- Variable.
Ich habs schon hingekriegt dass mir alle Dateien im Terminal aufgelistet werden aber wie kann ich die in ein Array speichern?
Wenn ich ein zweidimensionales Array anlege zB so:
char inhalt[][] = { "Hallo", "dies", "sind", "namen"};
Hab ich das Array genau so "befüllt" wie ich es mir vorstelle.
Ich kann dann mit inhalt[0] auf zB das Wort "Hallo" zugreifen oder mit beispielsweise inhalt[0][2] auf das Zeichen "l" (3ter Buchstabe von Hallo)Hab extra ein zweidimensionales damit ich die auf die einzelnen namen zugreifen kann, beim eindimsionalen array wäre ja nur jedes zeichen einzeln aufrufbar mit inhalt[x].
Aber wie kann ich nachträglich die Inhalte vom Array eintragen?
Wenn ichs vorher nur deklariere ohne es zu initialisieren mit zBchar inhalt[1000][1000];
Und jetzt will ich mit einer schleife nach und nach das array füllen also zB
char inhalt[0][] = "dateiname abc"; char inhalt[1][] = "ndateiname xzy"; char inhalt[2][] = "dateiname 123"; char inhalt[3][] = "textdatei-bla";
Das funktioniert so leider nicht aber ich hätte es gerne so
Damit ich auf den arrayinhalt auch zugriefen kann, mit zB einfach nur
printf("hier der name bei index nr 0: %s", inhalt[0]); printf("hier der name bei index nr 1: %s", inhalt[1]); printf("hier der name bei index nr 2: %s", inhalt[2]);
usw...
Oder hat jemand eine gänzlich andere Idee wie / wo ich die Dateinamen abspeichere?
-
Alfex schrieb:
Ich möchte alle Dateien im Verzeichnis auflisten, da bietet sich ja grundsätzlich ein Array an und nicht für jede Datei eine eigene char- Variable.
Ein Dateiname wird kaum in eine char-Variable passen.
Dazu brauchst du schon ein Array.Alfex schrieb:
Wenn ich ein zweidimensionales Array anlege zB so:
char inhalt[][] = { "Hallo", "dies", "sind", "namen"};
DAs sollte eigentlich gar nicht compilieren, da nur der erste Index offen sein darf.
Alfex schrieb:
char inhalt[0][] = "dateiname abc"; char inhalt[1][] = "ndateiname xzy"; char inhalt[2][] = "dateiname 123"; char inhalt[3][] = "textdatei-bla";
Du definierst hier viermal die Variable inhalt als Array. D.h. die Variable wird neu angelegt.
Aber das willst du gar nicht.
Dabei machst du fast alle möglichen Fehler.
Der Variabletyp vor dem Namen macht daraus die Definition.
Es kann nur der erste (linke) Index offen bleiben.
Arrays kann man nicht mit dem = zuweisen.Das sind absolute Grundlagen.
Die kann man nicht mal eben googeln.
Lies das Kapitel über Arrays und Strings nochmal (auch mehrmals) durch.
In einem Buch.
-
Alfex schrieb:
Ich möchte alle Dateien im Verzeichnis auflisten, da bietet sich ja grundsätzlich ein Array an und nicht für jede Datei eine eigene char- Variable.
Eigentlich hast du mich schon an dieser Stelle abgehängt, denn bei "Ich möchte alle Dateien im Verzeichnis auflisten" wäre "da bietet sich ein Array an" ziemlich weit hinten auf der Liste meiner Gedankengänge gewesen.
Fangen wir doch mal ganz von vorne an:
Ich habs schon hingekriegt dass mir alle Dateien im Terminal aufgelistet werden
Also hast du dein Vorhaben bereits gelöst? Zu welchem Zweck möchtest du die Namen nun speichern?
wie kann ich die in ein Array speichern?
Kommt drauf an, wo du die Namen überhaupt her hast. Aber ich würde mir an deiner Stelle noch einmal gründlich überlegen, ob du das wirklich brauchst oder überhaupt möchtest. Was hast du vor?
Deine Überlegungen zu Arrays sind grundsätzlich ziemlich falsch. Du solltest dir dringend ein gutes(!) Buch zum Thema Arrays und insbesondere Zeichenketten in C durchlesen. Die verhalten sich nämlich ganz anders, als man das von manchen anderen Sprachen gewohnt ist oder wie man es eventuell intuitiv erwarten würde. Mit Ausprobieren und Raten wird man auf keinen grünen Zweig kommen.
Wenn ich ein zweidimensionales Array anlege zB so:
char inhalt[][] = { "Hallo", "dies", "sind", "namen"};
Hab ich das Array genau so "befüllt" wie ich es mir vorstelle.
Ich kann dann mit inhalt[0] auf zB das Wort "Hallo" zugreifen oder mit beispielsweise inhalt[0][2] auf das Zeichen "l" (3ter Buchstabe von Hallo)Glaub ich dir nicht. Der Code compiliert nämlich nicht einmal.
Aber wie kann ich nachträglich die Inhalte vom Array eintragen?
Durch Zuweisungen natürlich. Bloß kann man nicht ein ganzes Array auf einmal einem anderen zuweisen. Jeder einzelne Eintrag, hier also jedes Zeichen, muss einzeln zugewiesen werden. Es mag Funktionen in der Standardbibliothek geben, die einem diese Aufgabe abnehmen (und dabei intern auch effizienter vorgehen, als dies mit Bordmitteln geht).
-
Auch würde ich, wenn die Anzahl der ausgelesenen Dateien/Verzeichnisse bereits bekannt ist, die dynamische Speicherverwaltung per calloc() hinzuziehen. Das ist wesentlich besser als char inhalt[1000][1000] zu definieren.
-
Sorry da bin ich wohl doch relativ weit auf dem Holzweg...
Ein Dateiname wird kaum in eine char-Variable passen.
Dazu brauchst du schon ein Array.Stimmt, hab mich da mit meiner Wortwahl vertan!
Ich weiß nicht wie ichs "richtig" ausdrücke, ich erstelle ein Array vom Datentyp char, also ein Array was aus mehreren chars besteht um darin einen (nullterminierten= letzter char = \0) String abspeichern zu können.Eigentlich hast du mich schon an dieser Stelle abgehängt, denn bei "Ich möchte alle Dateien im Verzeichnis auflisten" wäre "da bietet sich ein Array an" ziemlich weit hinten auf der Liste meiner Gedankengänge gewesen.
Ich bin darauf gekommen weil im Beispiel hier hier:
https://de.wikibooks.org/wiki/C-Programmierung:_Arrays
steht:[...]Es wäre natürlich sehr ungeschickt, wenn Sie die Variable umsatz1 bis umsatz7 deklarieren müssten[...] Für die Lösung des Problems werden stattdessen Arrays [...] benutzt
Und nochmal sorry zu meinem Programmbeispiel:
char inhalt[][] = { "Hallo", "dies", "sind", "namen"};
Das sollte etwas anders sein, so hab ichs gemacht:
char inhalt[1024][1024] = { "Hallo", "dies", "sind", "namen"};
Hier mein Beispiel:
http://abload.de/thumb/tesiva73.jpgDann hole ich nochmal weiter aus:
ich muss ein Programm programmieren um zB alle "txt" Dateien in "ini" Dateien umzubenennen.
Dabei sollen die änderungen als parameter übergeben werden. Also die Endung soll vom Anwender bestimmt werden durch Übergabeparameter.
Also zB alle TXT in INI oder alle CFG in TXT oder alle DOC in DOCX oder oder...Das Programm hat keinen "praktischen nutzen" sondern ist eine schulische Aufgabe die ich lösen muss.
Das umbenennen an sich hab ich schon hingekriegt, ich muss es jetzt aber ja mit allen Dateien im Verzeichnis machen bzw nur mit mit denen die eine bestimmte Endung besitzen.
@TocToc
Leider weiß ich ja nicht wieviele Dateien vorhanden sind, mal vielleicht nur 2, vielleicht aber auch mal 200
-
Wo bekommst du die Dateinamen her?
- als Parametr beim Programmaufruf?
: Dann stehen sie schon inargv
- durch eine Funktion vom Betriebssystem?
: dann bekommst du mit jedem Aufruf der Funktion einen neuen Namen (oder auch eine fertige Liste).
-
DirkB schrieb:
Wo bekommst du die Dateinamen her?
- als Parametr beim Programmaufruf?
: Dann stehen sie schon inargv
- durch eine Funktion vom Betriebssystem?
: dann bekommst du mit jedem Aufruf der Funktion einen neuen Namen (oder auch eine fertige Liste).Habe da bisher nur dieses Beispiel:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <dirent.h> int main(int argc, char **argv) { DIR *dirHandle; struct dirent * dirEntry; dirHandle = opendir("."); /* oeffne aktuelles Verzeichnis */ if (dirHandle) { while (0 != (dirEntry = readdir(dirHandle))) { puts(dirEntry->d_name); } closedir(dirHandle); } }
Sieht dann so aus:
http://www.bilderuploaden.de/aihspro2/out.php/t33904_ordner.JPGAuf die gefahr hin dass ihr mich dafür am liebsten umbringen wollt:
Ich hatte jetzt die Idee in die while schleife anstatt die Namen einzeln mit "puts" auszugeben nach und nach in ein Array zu schreiben....
-
Und an welcher Stelle brauchst du nun ein Array? Mit dem dirEntry bekommst du doch einen Eintrag nach dem anderen und kannst nun gucken, ob er umbenannt werden soll.
Wenn du stattdessen erst alles in ein Array packst, kannst du dann einen Eintrag nach dem anderen durchgehen und gucken, ob er umbenannt werden soll.
Fällt dir was auf? Das dirEntry-Objekt verhält sich bereits genau so, wie du es von deinem Array wünschen würdest.
-
Alfex schrieb:
Auf die gefahr hin dass ihr mich dafür am liebsten umbringen wollt:
Ich hatte jetzt die Idee in die while schleife anstatt die Namen einzeln mit "puts" auszugeben nach und nach in ein Array zu schreiben....Was hältst du davon, statt
puts
deine rename-Funktion aufzurufen?
(Mit den entsprechenden Paramtern.)
-
Ok, ihr habt wohl Recht!
Ich probier meine Rename-funktion die ja schon läuft als unterfunktion da einzubauen!