it-swarm.com.de

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

Der Code, den ich habe, lautet 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 Datei oder Verzeichnis

Die Datei 'data.txt' ist definitiv im Arbeitsverzeichnis vorhanden (sie befindet sich in dem Verzeichnis, das meine .c- und .h-Dateien enthält). Warum gibt fopen () einen NULL-Zeiger zurück?

15
Barjavel

Ist es möglich, dass der Dateiname nicht wirklich "data.txt" ist?

Bei Unix handelt es sich bei Dateinamen eigentlich um Byte-Zeichenfolgen und nicht um Zeichenfolgen. Es ist möglich, Dateien mit Steuerelementen wie Backspace im Namen zu erstellen. Ich habe in der Vergangenheit Fälle gesehen, in denen das Kopieren in Terminals zu Dateien mit normal aussehenden Namen führte, der Versuch, den Dateinamen in einer Verzeichnisliste zu öffnen, jedoch zu einem Fehler führt.

Eine Möglichkeit, um sicher zu sagen, dass die Dateinamen wirklich das sind, was Sie denken:

$ python
>>> import os
>>> os.listdir('.')
7
wberry

Standard Problem. Versuchen

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

Das heißt Versuchen Sie es zuerst mit dem vollständigen absoluten Pfad zu öffnen. Wenn es funktioniert, müssen Sie nur herausfinden, was das aktuelle Verzeichnis mit _getcwd() ist, und dann Ihren relativen Pfad festlegen.

11
Jacob

Mein Problem war, dass ich eine Datei Dateiname.txt hatte und nicht wusste, dass es sich in Wirklichkeit um Dateiname.txt.txt handelte, da Windows die Erweiterung nicht zeigte.

3
Janne

Unsichtbares Leerzeichen in Dateiname?

Einmal im Jahr habe ich ein ähnliches Problem: Ich versuche, eine Datei mit dem Dateinamen in einer Zeichenfolge zu öffnen, die aus einer Stichoperation stammt. Wenn ich den Namen drucke, scheint es OK 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. Natürlich hilft das nicht bei nicht druckbaren Zeichen.

2
karsten

Stellen Sie sicher, dass sich Ihre Eingabedatei im selben Verzeichnis wie die ausführbare Datei befindet. Dies kann sich von dem Verzeichnis unterscheiden, in dem sich Ihre Quelldateien befinden. Wenn Sie das Programm in einem IDE -Debugger ausführen, stellen Sie sicher, dass Ihr Arbeitsverzeichnis auf den Speicherort der Eingabedatei gesetzt ist. Wenn Sie * nix anstelle von Windows ausführen, müssen Sie möglicherweise den Dateinamen "./" voranstellen.

2
Kevin D.

Ich bin auf den gleichen Fehler gestoßen, der beim Öffnen unter Linux von einer von Windows beschädigten Skriptdatei verursacht wurde.

ENOENT 2 Keine solche Datei oder kein solches Verzeichnis

Wordpad unter Windows (oder einem anderen Microsoft-Täter) hat CRLF = (0x0D, 0x0A) anstelle von newline = LF = 0x0A in meine Linux-Skriptdateien eingefügt. Beim Einlesen des Dateinamens in einen Puffer und Aufrufen von fopen ist ein Fehler aufgrund des unsichtbar angehängten CR-Zeichens aufgetreten.

Im Codelite-Editor unter Linux Mint konnte ich EOL-Zeichen anzeigen (Ansicht> EOL anzeigen) und durch Suchen und Ersetzen entfernen, indem ich die CRLF aus den beschädigten Skriptdateien kopierte und die LF von eine unbeschädigte Datei in die Textfelder.

0
Tron

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. Möglicherweise kann das Programm nicht auf die Datei zugreifen, weil die Berechtigung abgelehnt wird. 

0
Nautilus