Unbekannten Dateinamen ermitteln?
-
Ich möchte einen Dateinamen ermitteln, der Haken: der Name der Datei ist nicht bekannt, da er sich verändern kann. Bekannt ist, dass die Datei einmal vorhanden ist, der Pfad und das Schema des Namens. Der Besteht aus einem führendem Zeichen (d), Nummern (x), Trennzeichen (_) und der Endung .txt.
so: dx_x_x.txt. Also zB: d5_2_2.txt oder auch d5_2_3.txt ... usw.Wie könnte eine Funktion aussehen. die mir den Namen als string zurückgibt.
Ich habe schon überlegt den Namen in seine "Spalten", welche die Zahlen enthalten zu zerlegen und irgendwie mit einer Schleife durchzuzählen bis man den passenden Eintrag gefunden hat, ablegt, das ganze mit der jeweils nächsten Spalte wiederholt bis alle durch sind, die Ergenisse zusammensetzt, eine Existenzprüfung macht und dann übergibt. Ich wüsste aber nicht wie ich das umsetzen könnte. Hat sowas schon mal jemand gemacht bzw. weis jemand wie man das am besten lösen könnte?
Danke im Voraus!
-
Da du ja weißt, wie der Name gebildet wird, sollte es kein Problem sein, alle möglichen Dateinamen zusammenzubauen. Anschließend kannst du versuchen, die so gebildete Datei per ifstream() zu öffnen - wenn's nicht geklappt hat, existiert die Datei vermutlich nicht.
Die Alternative dazu ist systemabhängig: Lass dir von FindFirstFile/FindNextFile alle .txt Dateien im richtigen Pfad ausgeben und greif dir die erste Datei, die deinem Namensschema entspricht.
-
danke das werd ich mal probieren...
bisher hab ichs mal so versucht, aber das klappt irgendewie nicht so recht
#include <iostream> #include <stdio.h> #include <sys/types.h> #include <dirent.h> using namespace std; const char* getFileName(); DIR *d; dirent *di; const char* getFileName() { const char * filename; if ((d = opendir ("home/user/test")) != NULL) { unsigned int first_fnum, mid_mnum, last_lnum; int name_found = 0; first_fnum = mid_mnum = last_lnum = 0; while ((di = readdir (d)) != NULL) { unsigned int fnum, mnum, lnum; if (sscanf(di->d_name,"f%u_%u_%u",&fnum,&mnum,&lnum) == 3) { name_found = 1; if ( fnum > first_fnum ) { first_fnum = fnum; mid_mnum = mnum; last_lnum = lnum; } else if ( fnum == first_fnum ) { if ( mnum > mid_mnum ) { mid_mnum = mnum; last_lnum = lnum; } else if ( mnum == mid_mnum ) { if ( lnum > last_lnum ) last_lnum = lnum; } } } } closedir(d); sprintf((char*) filename,"%u_%u_%u",first_fnum, mid_mnum, last_lnum); } return filename; } main() { cout<<getFileName()<<endl; }
-
dixidix schrieb:
bisher hab ichs mal so versucht, aber das klappt irgendewie nicht so recht
Wäre es zuviel verlangt das "es klappt irgendwie nicht" vielleicht ein wenig zu beschreiben. Ansonsten meine Antwort: Du machst irgendwie was falsch. Hat dir das geholfen?
-
Es wird normal kompiliert. Wende ich das Programm an und ist eine Datei vorhanden, bekomme ich nur Speicherzugriffsfehler, ist keine Datei vorhanden, nur unsinnige Zeichen.
Hat dir das geholfen?
-
dixidix schrieb:
Speicherzugriffsfehler
Zufällig in Zeile 47?
Reservier mal Speicher für "filename". Ausserdem ist es schon stark, filename als konstant zu definieren und dann per Cast an eine Funktion zu übergeben die zweifellos drauf schreibt