web-dev-qa-db-ja.com

fopen()はNULLポインターを返しますが、ファイルは確実に存在します

私が持っているコードは次のとおりです:

FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
    perror("Can't open file");
} 

返されるエラーメッセージは次のとおりです。

ファイルを開けません:そのようなファイルまたはディレクトリはありません

'data.txt'ファイルは作業ディレクトリ(.cおよび.hファイルを含むディレクトリに存在する)に確実に存在するので、fopen()がNULLポインターを返すのはなぜですか?

18
Barjavel

ファイル名が実際には「data.txt」ではない可能性はありますか?

Unixでは、ファイル名は実際には文字列ではなくバイト文字列であり、名前にバックスペースなどのコントロールを含むファイルを作成することが可能です。これまでに、ターミナルにコピーして貼り付けると、通常の名前のファイルが作成される場合がありましたが、ディレクトリリストに表示されるファイル名を開こうとすると、エラーが発生します。

ファイル名が実際にあなたが思っているとおりであることを確認する1つの方法:

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

標準的な問題。試す

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

つまり最初に完全な絶対パスで開いてみてください。それが機能する場合は、現在のディレクトリが_getcwd()で何であるかを理解し、相対パスを修正する必要があります。

12
Jacob

私の問題は、filename.txtというファイルがあり、拡張子が表示されていないため、実際にはfilename.txt.txtであることを理解していなかったことです。

3
Janne

ファイル名に非表示のスペース文字?

1年に1回、同様の問題があります。文字列内のファイル名を含むファイルを、スティング操作から取得して開こうとします。名前を出力すると問題ないようですが、fopen()はnullポインターを返します。唯一のヘルプは、ファイル名文字列の正確な先頭と末尾を示す区切り文字を付けて名前を出力することです。もちろん、これは印刷不可能な文字には役立ちません。

2
karsten

入力ファイルが実行可能ファイルと同じディレクトリにあることを確認してください。これは、ソースファイルが保持されているディレクトリとは異なる場合があります。 IDEデバッガでプログラムを実行している場合は、作業ディレクトリが入力ファイルの場所に設定されていることを確認してください。また、Windowsではなく* nixで実行している場合、入力ファイル名の前に「./」を付加する必要がある場合があります。

2
Kevin D.

LinuxでWindowsによって破損したスクリプトファイルからfopenを実行するときに同じerrnoが発生しました。

ENOENT 2そのようなファイルまたはディレクトリはありません

Windows(またはその他のMicrosoft犯人)のワードパッドで、Linuxスクリプトファイルに改行= LF = 0x0Aの代わりにCRLF =(0x0D、0x0A)を挿入しました。ファイル名をバッファーに読み込み、不可視の追加されたCR文字が原因で失敗した場合にfopenを呼び出したとき。

Linux MintのCodeliteエディタでは、破損したスクリプトファイルからCRLFをコピーして貼り付け、LF破損していないファイルをテキストフィールドに入力します。

0
Tron

パスが正しく、ファイルが正しい場所にあることがわかっている、このような同様の問題が発生しました。ファイルの権限を確認してください。アクセス許可が拒否されているため、プログラムがファイルにアクセスできない可能性があります。

0
Nautilus