0

これは非常に奇妙なエラーです。

私は Visual Studio 2012 を使用しており、C++ プロジェクト (C プロジェクトのコンテナーとして) で、次の方法でファイルを読み込んでいます。

const char* fname = "SomeFile.csv";
if(!(fp = fopen(fname, "r")))
{
    printf("Error! Could not open %s!\n",fname);
    return;
}

CSV は .EXE と同じフォルダーにあり、それがこのプログラムの意図です。


1. デバッグで実行すると、CSV の読み取りに失敗します。

2. ファイルへのフル パス名を入力すると、正しく動作し、CSV が読み込まれます。

3. Windows エクスプローラーで出力フォルダーに移動し、.exe を実行すると、CSV が正しく読み込まれます。

4.ここが奇妙な部分です。別のフォルダー (他の場所) に移動し、.exe を含むフル パスを Windows エクスプローラーに貼り付けると、プログラムは正常に起動しますが、CSV の読み取りに失敗します。

注意点として、フォルダーをエクスプローラーに読み込んでいて、VS2012 デバッガーで実行すると、CSV の読み込みにも失敗します。

ここで何が起こっているのですか?ウィンドウがエクスプローラーで開いているときに実行している場合にのみ見つかるのはなぜですか?

4

1 に答える 1

0

fopenopenなどは、パス コンポーネントのない裸のファイル名を指定すると、「現在のディレクトリ」で指定されたファイルを開こうとします。ファイルシステムのルートを持たないファイル名を指定すると、現在のディレクトリからの相対ディレクトリでファイルを開こうとします。絶対 (フル) パスが指定された場合にのみ、指定した場所に正確に表示されます。

コマンド ライン ベースのシステムでは、現在のディレクトリは非常に明白です。これは、コマンドを発行したときのディレクトリです。

グラフィカル ユーザー インターフェイスでは、現在のディレクトリの概念はもう少し複雑です。

  • Windowsエクスプローラーでプログラムに移動し(たとえばWORD.EXE、 )、ダブルクリックします-現在のディレクトリは、プログラムがあるディレクトリである可能性があります-移動した場所です(ただし、これが必要であるという標準はありません)
  • プロジェクトのドキュメントに移動し、Word ドキュメントをダブルクリックすると、WORD.EXE が自動的に起動します。現在のディレクトリは何ですか? ドキュメントがある場所にある可能性が高いです。
  • [スタート] メニューから WORD.EXE を起動します。現在のディレクトリは一体何ですか?
  • デバッガーからプログラムを起動します。現在のディレクトリは何ですか?

この最後のポイントは、IDE / デバッガーがプログラムを起動するときに、現在のディレクトリとして何を使用するかを伝える必要がある理由です。

現在のディレクトリに正確に「デフォルト」ではありません-プログラムの現在のディレクトリを変更せずfileOpenDialogに、最後に開いた場所に開きます-ファイルを選択すると、そのファイルのフルパスがプログラムに渡されます。

于 2013-02-07T18:15:59.477 に答える