Datei abhängig vom eingegebenen Dateinamen öffnen
-
Hallo zusammen,
ich habe wieder ein kleines Problem mit dem ich einfach nicht weiterkomme. Ich schreibe momentan ein Programm, dass eine Datei öffnet und deren Inhalt verwendet(das funktioniert schon soweit) nur jetzt möchte ich den User die Möglichkeit geben einen Dateinamen einzugeben z.b. datei2.dat um somit verschiedene Dateien zuverwenden.
Wie ihr unten sehen könnt, funktioniert das schon mit der datei.dat, jedoch eine Eingabe des beliebigen Dateinamen funktioniert leider nicht. Ich habe ein paar Ansätze, aber leider funktioniert keiner. Ich wäre jeden sehr dankbar, der mir ein wenig weiterhelfen könnte.
void main(void) { const char *dateiName="datei.dat"; FILE *datei; /* printf("Welche Datei wollen Sie oeffnen?\n"); scanf("%c",dateiName); */ if ((datei=fopen(dateiName,"r"))!=NULL) { funktion(datei); } else { printf("Fehler beim Oeffnen der Datei \"%s\"!\n",dateiName); } }
-
Hallo.
Falsch:scanf("%c",dateiName);
besser:
scanf("%s",dateiName);
ist aber auch nicht ideal, besser wäre eine extra Routine zu schreiben.
Und wenn du den Inhalt auf den dateiName zeigt nachträglich änderst, dann kannst du dateiName nicht als const deklarieren.
-
Hallo Marcin, erstmal danke für deine schnelle Antwort. Das mit dem const war mir schon klar, damit hats ja bereits funktioniert, sprich mit der festgelegten Datei.
wenn ich aber jetzt den Code wie folgt ändere:
void main(void) { char *dateiName; FILE *datei; printf("Welche Datei wollen Sie oeffnen? "); scanf("%s",dateiName); if ((datei=fopen(dateiName,"r"))!=NULL) { funktion(datei); } else { printf("Fehler beim Oeffnen der Datei \"%s\"!\n",dateiName); } }
funktionierts leider auch noch nicht
.
Danke für den Hinweis wegen %c & %s, habe ich leider übersehen.
-
Marcin schrieb:
scanf("%s",dateiName);
ist aber auch nicht ideal, besser wäre eine extra Routine zu schreiben.
"Nicht ideal" ist gut, denn hier wird ein konstanter Zeiger auf einen festen Speicherbereich überschrieben (was - ohnehin schon kritisch durch das "konstant" - früher oder später zwangsläufig zu einem Arrayüberlauf führt).
Besser:
char dateiName[100]; fgets(dateiName, 100, stdin);
-
"Nicht ideal" ist gut, denn hier wird ein konstanter Zeiger
Bitte mein vorigen Beitrag genau durchlesen.
@Orangensaft
Dieses mal hast du überhaupt keinen Speicher reserviert:char *dateiName;
du hast nur einen Zeiger deklariert, aber keinen Speicher reserviert, besser wäre:
char dateiName[255];
Der Vorschlag mit fgets von LordJaxom ist schon um einiges sicherer als scanf.
-
Marcin schrieb:
"Nicht ideal" ist gut, denn hier wird ein konstanter Zeiger
Bitte mein vorigen Beitrag genau durchlesen.
Hab ich
, bitte meinen Satz nicht nur halb lesen. Ein Stringliteral gilt laut Standard auch als Konstant wenn man es einem non-const Zeiger zuweist.
Gegen die Variante mit dem Array plus Zuweisung sag ich nix
EDIT: Huch, die Variante ist plötzlich weg
-
@LordJaxom
Tut mir leid aber aus deinem vorigem Beitrag war schwer zu entnehmen was du meinst.
Das der Standard es so vorschreib wusste ich aber auch nicht.Huch
Orangensaft hat das aus seinem 2. Code auch entfernt, deshalb habe ich ohne initialisirung gelassen.
-
Also erstmal vielen vielen Dank das ihr mir helft. Finde ich echt super, da ich selbst nicht mehr weiterkomme. Ich sehe schon, hab schon wieder leichtsinnige Fehler gemacht.
void main(void) { char dateiName[100]; fgets(dateiName, 100, stdin); FILE *datei; if ((datei=fopen(dateiName,"r"))!=NULL) { funktion(datei); } else { printf("Fehler beim Oeffnen der Datei \"%s\"!\n",dateiName); } }
Jetzt kann ich den Dateinamen eingeben, nur leider komme ich jedesmal ins "else" rein, auch wenn ich den richtigen Dateinamen eingebe. Was mache ich falsch?
-
Oh, da bist Du auf eine hässliche Falle reingefallen:
If a newline is read, it is stored into the buffer.
Vermutlich mag er nicht so gerne eine Datei öffnen die mit \n aufhört. Du musst das Zeilenendezeichen noch entfernen, am einfachsten so:
if (dateiName[strlen(dateiName) - 1] == '\n') dateiName[strlen(dateiName) - 1] = 0;
Und diesmal lasse ich mir gerne vorwerfen, dass das nicht ideal ist (aber funktioniert :D)
-
Wow super danke, es funktioniert. Ich weis nicht, wie ich das wieder gut machen kann. Du hast mir sehr weitergeholfen.
void main(void) { char dateiName[100]; /* Aufforderung an den Benutzer einen Dateinamen einzugeben z.b. datei.dat */ printf("Welche Datei wollen Sie oeffnen? "); /* Einlesen des Dateinamens */ fgets(dateiName, 100, stdin); /* Leerzeile um den Abstand zur Ausgabe zu vergrößern */ printf("\n"); FILE *datei; /* Behebung des Fehlers, wenn der Dateiname mit \n aufhört */ if (dateiName[strlen(dateiName) - 1] == '\n') dateiName[strlen(dateiName) - 1] = 0; if ((datei=fopen(dateiName,"r"))!=NULL) { funktion(datei); } else { printf("Fehler beim Oeffnen der Datei \"%s\"!\n",dateiName); } }
-
mh ich weiß nicht wie sinnvoll es für deine afgstellung ist, aber du könntest den dateinamen auch über das argument an das programm übergeben?