fopen() gibt einen NULL-Zeiger zurück, aber die Datei existiert definitiv

Lesezeit: 4 Minuten

Benutzer-Avatar
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.

    – Nr

    13. Juli 2011 um 22:23 Uhr


Standardproblem. Versuchen

FILE *txt_file = fopen("C:\\SomeFolder\\data.txt", "r");

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.

Benutzer-Avatar
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.

Benutzer-Avatar
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.

Benutzer-Avatar
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.

1246750cookie-checkfopen() gibt einen NULL-Zeiger zurück, aber die Datei existiert definitiv

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy