web-dev-qa-db-ja.com

fopen()でファイルを開くことができません

ファイルを開いてテキストを出力しようとしましたが、エラーが発生し続けます。だから、最初から始めて、ファイルを開いてみようと思いました。これは私のコードです:

#include <stdio.h>
#include <stdlib.h>
#define CORRECT_PARAMETERS 3

int main(void)
{
    FILE *file;
    file = fopen("TestFile1.txt", "r");
    if (file == NULL) {
        printf("Error");
    }
    fclose(file);
}

ファイルを実行すると、「エラー」がコンソールに出力され、それだけです。 TestFile1.txtは、私の.exeと同じ場所にあります。どうすれば修正できますか?

9
jet

printf("Error");の代わりに、perror("Error")を試してみてください。これにより、失敗の実際の理由(権限の問題、無効な引数など)が出力される場合があります。

21
Kousik Nandy

ファイルをどのように実行していますか?コマンドラインからですか、IDEからですか?実行可能ファイルがあるディレクトリは、必ずしも作業ディレクトリではありません。

fopenでフルパス名を使用してみて、それが修正されるかどうかを確認してください。その場合、問題は説明されているとおりです。

例えば:

file = fopen("c:\\MyDirectory\\TestFile1.txt", "r");
file = fopen("/full/path/to/TestFile1.txt", "r");

または、コマンドウィンドウを開いて実行可能ファイルがあるディレクトリに移動し、手動で実行します。

余談ですが、単純なものを挿入できます(それぞれWindowsまたはLinux/UNIX/BSD/etcの場合):

system ("cd")
system("pwd")

fopenの前に、実際にどのディレクトリにいるかを示します。

11
paxdiablo

少しのエラーチェックは大いに役立ちます。常にerrnoの値をテストするか、perror()またはstrerror()を呼び出して、fopen()呼び出しが失敗した理由に関する詳細情報を取得できます。

そうでない場合、パスのチェックに関する提案はおそらく正しいでしょう。おそらく、IDEからのディレクトリであり、期待する権限を持っていません。

5
Rob Pelletier

さて、これで問題があることがわかりました。次のステップは、正確にエラーが何であるかを理解することです。これをコンパイルして実行するとどうなりますか?:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *file;
    file = fopen("TestFile1.txt", "r");
    if (file == NULL) {
      perror("Error");
    } else {
      fclose(file);
    }
}
4
Robert Gamble

実行可能ファイルの作業ディレクトリが、保存先のディレクトリ以外に設定されている可能性があります。 IDE設定を確認してください。

3
Mark Rushakoff

ファイル名には絶対パスを使用してください。また、Windowsを使用している場合は、getlasterror()を使用して実際のエラーメッセージを確認してください。

1
rplusg

上記に加えて、現在のディレクトリを表示したい場合があります。

int MAX_PATH_LENGTH = 80;
char* path[MAX_PATH_LENGTH];
getcwd(path, MAX_PATH_LENGTH);
printf("Current Directory = %s", path);

これはgcc/glibcプラットフォームでは問題なく動作するはずです。 (私はそのタイプのプラットフォームに最も精通しています)。 Windowsタイプのプラットフォームを使用している場合、getcwdおよびVisual Studioについての質問 ここに投稿 がありました。

1
Dan

出力フォルダディレクトリは、IDEの他のディレクトリに設定されている必要があります。これを変更するか、ファイル名を完全なファイルパスに置き換えることができます。

お役に立てれば。

0
Richie