fopen - variabler Dateinamen


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
#1
Hallo Community,

ich habe ein Programm erstellt, welches eine Datei, die im gleichen Ordner ablegt ist, wie das Programm, öffnet und daraus ließt.

Der dazugehörige Ansatz:
FILE *fp;
fp=fopen("datei.txt","r");

Nun möchte ich aber nur eine einzige Textdatei in den Ordner legen und das Programm soll selbstständig erkennen, wie die Datei benannt ist, um sie dann im nächsten Schritt zu öffnen.
Der Dateiname soll dabei auch in einer Variablen/Zeiger gespeichert werden, um ihn im Anschluss weiter zu verwenden.

Vielen Dank schon einmal im Voraus :)
 
#3
Moin,

wenn Du sicher bist dann nur eine Datei im Verzeichnis liegt, könntest Du es einfach auslesen und bekommst somit zwangsläufig den Dateinamen!

Rheinwerk Computing :: C von A bis Z – 17.3 Verzeichnisfunktionen
Dateioperationen in C++

VG Klaus
Danke für die schnelle Antwort.
Das mit dem Auslesen der Dateinamen habe ich hinbekommen, nur habe ich noch das Problem, dass ich diesen Dateinamen nicht für fopen verwenden kann.

Hier der Code soweit:
C:
DIR *dir;
struct dirent *dirzeiger;
char *dateiname;
if((dir=opendir("."))!=NULL)
{
    while((dirzeiger=readdir(dir))!=NULL)
    {
        if(strstr((*dirzeiger).d_name,".txt"))
        {
            dateiname=(*dirzeiger).d_name;
        }
    }
}
    
FILE *fp;
fp = fopen(dateiname,"r");
Wenn ich bei fopen für dateiname "eingabe.txt" [fopen("eingabe.txt","r")] einsetze funktioniert es. Wenn ich mir den Inhalt von dateiname ausgeben lasse, bekomme ich auch eingabe.txt angezeigt.
Nur wenn ich wie gezeigt den Zeiger direkt in fopen einsetze funktioniert es nicht :(
 

cwriter

Erfahrenes Mitglied
#4
Wenn ich bei fopen für dateiname "eingabe.txt" [fopen("eingabe.txt","r")] einsetze funktioniert es. Wenn ich mir den Inhalt von dateiname ausgeben lasse, bekomme ich auch eingabe.txt angezeigt.
Nur wenn ich wie gezeigt den Zeiger direkt in fopen einsetze funktioniert es nicht :(
Hi

manpage hat gesagt.:
The data returned by readdir() may be overwritten by subsequent calls
to readdir() for the same directory stream.
C:
dateiname=(*dirzeiger).d_name;
Du kopierst den Dateinamen nicht, sondern kopierst nur den Zeiger - es kann sein, dass du irgendeine andere Datei/Ordner zu öffnen versuchst. Lass dir sonst mal testweise den Dateinamen direkt vor dem Öffnen ausgeben.
Versuche es mal so:
C:
char* dateiname = NULL;
//...
dateiname = realloc(dateiname, strlen((*dirzeiger).d_name));
strcpy(dateiname, (*dirzeiger).d_name);
//...
FILE* fp = fopen(dateiname, "r");
//...
free(dateiname);
closedir(dir);
Gruss
cwriter
 
#5
Vielen Dank erstmal für deine Mühe :D

Lass dir sonst mal testweise den Dateinamen direkt vor dem Öffnen ausgeben.
Wenn ich mir das auf folgende Art und Weise ausgeben lasse, bekomme ich auch den gewünschten Namen der Datei eins zu eins angezeigt. (Und das ist auch nur einer...)
C:
if(strstr((*dirzeiger).d_name,".txt"))
{
    dateiname=(*dirzeiger).d_name;
    printf("%s\n",dateiname);
}
Bei diesen Teil bekomme ich immer eine Fehlermeldung: "invalid conversion from 'void*' to 'char*'":
dateiname = realloc(dateiname, strlen((*dirzeiger).d_name));
Hier nochmal der Quellcode, wie ich ihn eingegeben habe:
C:
DIR *dir;
struct dirent *dirzeiger;
char *dateiname = NULL;
if((dir=opendir("."))!=NULL)
{
    while((dirzeiger=readdir(dir))!=NULL)
    {
        if(strstr((*dirzeiger).d_name,".txt"))
        {
            dateiname=realloc(dateiname,strlen((*dirzeiger).d_name));
            strcpy(dateiname, (*dirzeiger).d_name);
        }
    }
}
    
FILE *fp;
fp = fopen(dateiname,"r");
free(dateiname);
closedir(dir);
 
#7
Super! Jetzt funktioniert es!
Vielen lieben Dank für deine Hilfe :D
Ich glaube, dass hätte ich nie herausgefunden, gerade weil es kaum nützliche und einfach verständliche Einträge bezüglich meiner Angelegenheit im Internet gibt.

Danke :)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…