2016-04-14 8 views
0

An einem gewissen Punkt in meinem Code, ich möchte für eine Datei einen Namen lesen, die ich (und/oder Bearbeitung) wird die Erstellung und ich habe mit den folgenden kommen:Mit fopen mit Eingabedateinamen in C

FILE *fp; 
char filename[15]; 
fgets(filename, 15, stdin); 
fp = fopen(filename, "a"); 
fprintf(fp, "some stuff goes here"); 
fclose(fp); 

Auch wenn das kompiliert und ausgeführt wird, erstellt es (oder öffnet, wenn ich es manuell erstelle) nicht die Datei, die von filename angegeben wird.
Was würden Sie vorschlagen?

+1

Sind Sie sicher, dass Sie die Datei an der richtigen Stelle suchen. Führen Sie auch eine Überprüfung durch, um zu sehen, ob fp == NULL ist, nachdem Sie es geöffnet haben. Wenn es NULL ist, bedeutet dies, dass beim Öffnen ein Fehler aufgetreten ist. Verwenden Sie die Perror-Funktion, um die Fehlermeldung zu erhalten. – chasep255

+0

Mögliches Duplikat von [Datei-I/O in C mit dynamischen Zeichenfolgen] (http://stackoverflow.com/questions/23789323/file-io-in-c-using-dynamic-strings) – usr2564301

Antwort

6

fgets() speichert das Newline-Zeichen, das nach dem Lesen einer Eingabezeile aus stdin gelesen wird. Sie müssen es manuell entfernen, z.

size_t len = strlen(filename); 
if (len > 0 && filename[len - 1] == '\n') 
    filename[len - 1] = '\0'; 

Sie auch, dass fopen() nicht zurück NULL überprüfen sollten, die es tun, wenn es nicht in der Lage war, die Datei zu öffnen. Ich denke, mit fprintf mit einem NULL Dateizeiger ist undefiniertes Verhalten.

0

Sie müssen filename[16] deklarieren, um 15 Zeichen zu verwenden, Sie benötigen Platz für die abschließende Null.

0

der Regel (aber nicht immer), fgets() geben Ihnen einen zusätzlichen '\n' der eingegebenen Zeichenfolge anhängt, weil

Ein Newline-Zeichen fgets macht aufhören zu lesen, aber es gilt als gültiges Zeichen von der Funktion und enthalten in der Zeichenfolge kopiert auf str.

Referenz:

fgets(filename, 15, stdin); 
filename[strcspn(filename, "\n")] = '\0'; 
0

Seit fgets werden Zeichenfolge util ein EOF oder eine neue Zeile, lesen und wenn ein Newline gelesen wird: http://www.cplusplus.com/reference/cstdio/fgets/

zu dem '\n' mit minimalem Code loszuwerden , wird es in den Puffer gespeichert. Das bedeutet, dass Sie die abschließende Zeilenumbrüche gegebenenfalls manuell beschneiden müssen. Ich würde vorschlagen, verwenden Sie stattdessen fscanf, es wird nicht die neue Zeile zum Puffer hinzufügen:

char filename[15]; 
int ret = fscanf(stdin, "%s", filename); 
if (ret != 1) { // handle input error } 
fp = fopen(filename, "a"); 
+0

Dies wird keine Zeilenschaltung lesen in den Puffer, aber es wird nicht mit Dateinamen mit Leerzeichen umgehen. – dreamlax