Dateien in C einlesen und bearbeiten
-
Hallo Comunity,
ich bin leider auch blutiger anfaenger in c programmierung und stehe vor folgendem problem:
ich will ein programm unter linux schreiben, das zufaellig beliebig viele dateien aus einem ordner einliest und mir die dateien im anschluss zur bearbeitung zur verfuegung stellt.
Das heisst ich habe eine bestimmte Anzahl an Dateien in meinem Ordner und suche mir zufaellig eine gewisse anzahl heraus. Diese Dateien will ich spaeter bearbeiten, bzw. addieren.Mein bisheriger Ansatz ist es, die Dateinamen in eine txt-File zu schreiben und anschliessend das Textfile in ein array umzuwandeln. Das funktioniert auch soweit ganz gut, so dass mir mein array auch die dateinamen ausgibt.
was muss ich nun tun, um diese dateien zufaellig auszuwaehlen, bzw. wieder in dateipfade umzuwandeln? ich hoffe jedenfalls, dass ddas alles so funktioniert.ist leider alles nicht so einfach zu erklaeren. Vielleicht kann mir ja jemand weiter helfen. Vielen Dank schonmal im Voraus.
Mein Programm sieht bisher folgendermassen aus:
[code]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main( int argc, char **argv)
{time_t t;
time(&t);
srand(t);// *.txt einlesen und in Datei test speichern
system("ls *.txt > test.txt");
system("more test.txt");printf("\n");
FILE *file;
file = fopen("test.txt", "r");
char zeichen[1000];printf("%c\n", file);
if (file == NULL)
{
printf("\nDatei jw.txt kann nicht geöffent werden\n");
exit(1);
}
else printf("Alles OK\n");while(!feof(file))
{
fscanf(file, "%c", &zeichen[i]);
if (!feof(file)) printf("%c", * zeichen);
}printf("\n");
//nun zeichen zufaellig sortieren und ausgeben
//nun dateien bearbeiten
fclose (file);
system("rm test.txt");
return 0;
}
-
Formatiere deinen Quelltext mal richtig. Wo ist i definiert? Du wertest bisher bloß einzelne Zeichen aus, Dateinamen sind aber üblicherweise eine Folge von Zeichen (String) und davon sehe ich nichts.
Lies mal was zu fgets, zeilenweises Lesen u.ä.
-
erst einmal danke wutz fuer die schnelle antwort.
das i habe ich als integer deklariert, aber leider vergessen hier mit in den quellcode zu schreiben. wird in der aktuellen version auch nicht mehr benoetigt.
habe zudem noch die fgets funktion verwendet, jetzt werden die dateien schonmal als ganzer string eingelesen. koennt ihr mir noch bei den weiteren problemen helfen? wie gesagt, ich bin leider noch anfaenger in c programmierung.
mein programm sieht bisher wir folgt aus:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( int argc, char **argv) { time_t t; time(&t); srand(t); // *.txt einlesen und in Datei test speichern system("ls *.dos > test.txt"); system("more test.txt"); FILE *file; file = fopen("test.txt", "r"); char zeichen[1000]; if (file == NULL) { printf("\nDatei test.txt kann nicht geöffent werden\n"); exit(1); } else printf("Alles OK\n"); while(!feof(file)) { fgets(zeichen, 1000, file); if (!feof(file)) puts(zeichen); } printf("\n"); //strings zufaellig sortieren fclose (file); system("rm test.txt"); return 0; }
-
-
vielen dank wutz!
das hilft mir schonmal sehr viel weiter. schau mir das jetzt mal in ruhe an und falls ich noch probleme haben sollte, nerv' ich dich einfach weiter

(beim naechsten mal auch mit C/C++ tag, versprochen)

-
Hallo nochmal,
ich habe das Programm mittlerweile soweit, dass es ein bestimmtes Verzeichnis ausliest, die Dateinamen in einen string schreibt, den String im Anschluss zufaellig durchmischt und die neue Liste wieder ausgiebt.
Mein Problem ist jetzt allerdings, dass sich in der zufaelligen Liste Dateinamen wiederholen. Das ist jedoch leider unbrauchbar fuer mich. jede datei, darf bei mir nur einmal vorkommen. also wollte ich um den Zufallsbefehl eine funktion setzten, die mir abgleicht ob die zahl schon vorgekommen ist, falls ja, muss er erneut "wuerfeln". Leider komme ich mit dieser Funktion nicht recht voran, habe mir ueberlegt das ganze mit einer while-Schleife zu realisieren.
vielleicht kann mir jemand von euch weiterhelfen. danke schonmal.#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXFILES 255 #define MAXFILENAMESIZE 255 void Datentausch(char (*namen)[MAXFILENAMESIZE], int i, int y) { printf("\nAustausch der beiden Strings\n%s\n%s\n", namen[i],namen[y]); strcpy (namen[i], namen[y]); } int main( int argc, char **argv) { char namen[MAXFILES][MAXFILENAMESIZE]; int i = 0, z = 0, iAnzahl = 0, iZufall = 0; srand(time(0)); // *.txt einlesen und in Datei test speichern system("ls *.txt > test.txt"); system("more test.txt"); FILE *file; file = fopen("test.txt", "rt"); char zeichen[MAXFILENAMESIZE]; if (file == NULL) { printf("\nDatei test.txt kann nicht geöffent werden\n"); exit(1); } else printf("\nAlles OK\n"); while( z < MAXFILES && fgets(zeichen, sizeof zeichen, file) ) { if( strchr(zeichen,'\n') ) *strchr(zeichen,'\n')=0; // newline entfernen strcpy( namen[z++], zeichen ); } for (i = 0; i < z; i++) { fprintf(stderr, "Test:\t%s\n", namen[i]); } // Random for(i = 0; i < z; i++) { // hier sollte die Funktion zum Vergleich der Zufallszahl hin iZufall = rand ( ) %z; Datentausch(namen, i, iZufall); } fprintf(stderr, "Random:\n"); for (i = 0; i < z; i++) { fprintf(stderr, "Test2:\t%s\n", namen[i]); } // Speicher freigeben fclose (file); system("rm test.txt"); return 0; }
-
Was ist der Sinn der Funktion Datentausch? Du kannst doch auch strcpy direkt aufrufen
Du müsstest eig. jede schon verwendete Zahl in einem eigenen Array abspeichern und dann jede neue mit allen anderen vergleichen ( vielleicht bietet es sich an den array zu sortieren damit man weniger vergleiche machen muss oder sogar nen baum zu nehmen)
-
Datentausch ist falsch, es tauscht nicht sondern weist nur zu. Völlig klar, dass das schiefgeht. Das einzige, was ich dir an Arbeit übrig gelassen habe hast du dann auch noch falsch gemacht.

void Datentausch(char (*namen)[MAXFILENAMESIZE], int i, int y) { printf("\nAustausch der beiden Strings\n%s\n%s\n", namen[i],namen[y]); if( i!=y ) { char tmp[MAXFILENAMESIZE]; strcpy (tmp, namen[y]); strcpy (namen[y], namen[i]); strcpy (namen[i], tmp); } }
-
zu meiner Verteidigung: ich habe vomn Anfang an gesagt, dass ich noch Anfaenger in C bin. versuch ja gerade das ganze zu lernen.
Daher versteh ich auch ehrlich gesagt den Unterschied zwischen meinem und deinem Programm nicht. wieso macht es einen unterschied ob ich direkt namen[i] den inhalt von namen[y] uebergebe oder ob ich es ueber zwei weitere schritte mach und noch einen speichervariable tmp brauche?
entschuldige meine unwissenheit.
-
Bitte erkläre doch mal jemand anderes, wo der Unterschied zwischen einer Zuweisung/Kopie und einem Tausch liegt. Haben wir ein Forum "Deutsch"? Dann bitte dorthin verschieben.
