fopen() gibt einen NULL-Zeiger zurück, aber die Datei existiert definitiv
Lesezeit: 4 Minuten
Barjavel
Der Code, den ich habe, ist wie folgt:
FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
perror("Can't open file");
}
Die zurückgegebene Fehlermeldung lautet:
Datei kann nicht geöffnet werden: Keine solche Datei oder kein Verzeichnis
Die Datei ‚data.txt‘ existiert definitiv im Arbeitsverzeichnis (sie existiert in dem Verzeichnis, das meine .c- und .h-Dateien enthält), also warum gibt fopen() einen NULL-Zeiger zurück?
führen Sie von der Befehlszeile oder von einer IDE aus? Wenn IDE, sind Sie sicher, dass das Arbeitsverzeichnis des Programms auf das Verzeichnis eingestellt ist, das die Datendatei enthält?
– fvu
13. Juli 2011 um 22:12 Uhr
können Sie die Ausgabe von hinzufügen ls -Fal für das betreffende Verzeichnis?
– Fredrik Pihl
13. Juli 2011 um 22:12 Uhr
Sie haben möglicherweise keine Berechtigung, es zu öffnen. bist du auf linux?
– Vinicius Kamakura
13. Juli 2011 um 22:15 Uhr
Kannst du den ganzen Code anhängen?
– Benutzer482594
13. Juli 2011 um 22:15 Uhr
Sie können das aktuelle Arbeitsverzeichnis mit der Funktion _getcwd() abrufen, die Sie zum Debuggen und Erlernen des Arbeitsverzeichnisses verwenden, in dem Visual Studio Ihr Programm ausführt.
Versuchen Sie also zuerst, es mit dem vollständigen absoluten Pfad zu öffnen. Wenn es funktioniert, müssen Sie nur herausfinden, was das aktuelle Verzeichnis ist _getcwd() und korrigieren Sie dann Ihren relativen Pfad.
Ist es möglich, dass der Dateiname nicht wirklich “data.txt” ist?
Unter Unix sind Dateinamen wirklich Byte-Strings, keine Zeichenketten, und es ist möglich, Dateien mit Steuerelementen wie Backspace in ihren Namen zu erstellen. Ich habe in der Vergangenheit Fälle gesehen, in denen das Kopieren und Einfügen in Terminals zu Dateien mit gewöhnlich aussehenden Namen führte, aber der Versuch, den Dateinamen zu öffnen, der in einer Verzeichnisliste erscheint, führt zu einem Fehler.
Eine Möglichkeit, um sicher zu sein, dass die Dateinamen wirklich so sind, wie Sie denken, sind:
$ python
>>> import os
>>> os.listdir('.')
Sie meinen, dass der Dateiname “data.txt” mit der Dateierweiterung “.txt” sein könnte? Das heißt, der vollständige Name der Datei könnte „data.txt.txt“ lauten?
– Barjavel
13. Juli 2011 um 22:54 Uhr
Dies stellte sich heraus.
– Barjavel
13. Juli 2011 um 23:11 Uhr
Mein Problem war, dass ich eine Datei filename.txt hatte und nicht wusste, dass es in Wirklichkeit filename.txt.txt war, weil Windows die Erweiterung nicht anzeigte.
Stellen Sie sicher, dass sich Ihre Eingabedatei im selben Verzeichnis wie die ausführbare Datei befindet, die sich möglicherweise von dem Verzeichnis unterscheidet, in dem Ihre Quelldateien gespeichert sind. Wenn Sie das Programm in einem IDE-Debugger ausführen, stellen Sie sicher, dass Ihr Arbeitsverzeichnis auf den Speicherort der Eingabedatei festgelegt ist. Wenn Sie in * nix statt in Windows arbeiten, müssen Sie dem Eingabedateinamen möglicherweise ein “./” voranstellen.
Karsten
Unsichtbares Leerzeichen im Dateinamen?
Einmal im Jahr habe ich ein ähnliches Problem: Ich versuche, eine Datei mit dem Dateinamen in einem String zu öffnen, der aus einer Stichoperation stammt. Wenn ich den Namen drucke, scheint es in Ordnung zu sein, aber fopen() gibt einen Nullzeiger zurück. Die einzige Hilfe besteht darin, den Namen mit Trennzeichen zu drucken, die den genauen Anfang und das Ende der Dateinamenzeichenfolge anzeigen. Das hilft natürlich nicht bei nicht druckbaren Zeichen.
Nautilus
Ich hatte gerade ein ähnliches Problem wie dieses, bei dem ich wusste, dass der Pfad korrekt war und sich die Datei am richtigen Ort befand. Überprüfen Sie die Dateiberechtigungen. Es ist möglich, dass das Programm nicht auf die Datei zugreifen kann, weil ihm die Berechtigung verweigert wird.
Tron
Ich bin auf dieselbe Fehlernummer gestoßen, um unter Linux aus einer von Windows beschädigten Skriptdatei zu fopen.
ENOENT 2 Keine solche Datei oder Verzeichnis
Wordpad unter Windows (oder ein anderer Microsoft-Täter) hat CRLF = (0x0D, 0x0A) in meine Linux-Skriptdateien anstelle von newline = LF = 0x0A eingefügt. Wenn ich den Dateinamen in einen Puffer einlese und fopen aufrufe, ist dies aufgrund des unsichtbaren angehängten CR-Zeichens fehlgeschlagen.
Im Codelite-Editor von Linux Mint konnte ich EOL-Zeichen anzeigen (Ansicht > EOL anzeigen) und sie mit Suchen und Ersetzen entfernen, indem ich das CRLF aus den beschädigten Skriptdateien und das LF aus einer nicht beschädigten Datei in den Text kopierte und einfügte Felder.
12467500cookie-checkfopen() gibt einen NULL-Zeiger zurück, aber die Datei existiert definitivyes
führen Sie von der Befehlszeile oder von einer IDE aus? Wenn IDE, sind Sie sicher, dass das Arbeitsverzeichnis des Programms auf das Verzeichnis eingestellt ist, das die Datendatei enthält?
– fvu
13. Juli 2011 um 22:12 Uhr
können Sie die Ausgabe von hinzufügen
ls -Fal
für das betreffende Verzeichnis?– Fredrik Pihl
13. Juli 2011 um 22:12 Uhr
Sie haben möglicherweise keine Berechtigung, es zu öffnen. bist du auf linux?
– Vinicius Kamakura
13. Juli 2011 um 22:15 Uhr
Kannst du den ganzen Code anhängen?
– Benutzer482594
13. Juli 2011 um 22:15 Uhr
Sie können das aktuelle Arbeitsverzeichnis mit der Funktion _getcwd() abrufen, die Sie zum Debuggen und Erlernen des Arbeitsverzeichnisses verwenden, in dem Visual Studio Ihr Programm ausführt.
– Nr
13. Juli 2011 um 22:23 Uhr