2011-07-13 3 views
12

次のように私が持っているコードは次のとおりです。のfopen()はNULLポインタを返すが、ファイルが間違いなく存在する

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

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

ファイルを開くことができません:いいえそのようなファイルまたはディレクトリ

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

+4

コマンドラインまたはIDEから実行していますか? IDEの場合は、プログラムの作業ディレクトリがデータファイルを含むディレクトリに設定されていますか? – fvu

+0

問題のディレクトリに 'ls -Fal'の出力を追加できますか? –

+1

あなたはおそらくそれを開く権限がありません。あなたはLinux上にいますか? –

答えて

7

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

Unixでは、ファイル名は実際には文字列ではないバイト文字列であり、名前にバックスペースなどのコントロールを含むファイルを作成することは可能です。私は過去に端末にコピーして普通の名前のファイルを作成するケースを見たが、ディレクトリリストに表示されるファイル名を開くとエラーが発生する。

$ python 
>>> import os 
>>> os.listdir('.') 
+4

ファイル名が ".txt"の "data.txt"である可能性がありますか?つまり、フルネームのファイルは 'data.txt.txt'ですか? – Barjavel

+3

このことが判明しました。 – Barjavel

2

が1よりも異なっていてもよく、入力ファイルは実行ファイルと同じディレクトリにあることを確認してください:ファイル名は、本当にあなたは彼らが何を考えていることを確実に伝えるために

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

+2

UNIXの 'fopen()'に渡されるファイル名の前に '。/'を付ける理由はありません。 – caf

9

標準的な問題です。試してみてください

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

私は最初にフル絶対パスでオープンしてみてください。それが動作すれば、現在のディレクトリの内容を把握して_getcwd()とし、相対パスを修正するだけです。

2

ファイル名に不可視のスペース文字はありますか?

年に一度私は同様の問題があります: ファイル名を文字列にして、スティング操作で取得しようとしました。名前を印刷するとOKと思われますが、fopen()はnullポインタを返します。唯一の助けとなるのは、ファイル名文字列の正確な開始と終了を示す区切り文字で名前を出力することです。もちろん、これは印刷不可能な文字では役に立ちません。

0

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

2

私の問題は、ファイルfilename.txtがあり、実際には拡張子が表示されていないためにfilename.txt.txtだったことに気付きませんでした。

関連する問題