0

exeと同じディレクトリに保存されているファイルからテキストを読み取るexeを実行しています。ファイルが見つからないことを意味する errno 2 を返す _tfopen 関数を使用しています。既に述べたように、テキスト ファイルは exe と同じディレクトリにあるため、パス全体ではなくテキスト ファイルのファイル名のみを使用します (絶対ファイルパスを使用しようとしましたが...)。開発中のコンピューター (リリース バージョン) ではなく、別のコンピューターから exe を実行しています。

同じディレクトリにある同じファイルを使用する別のアプリケーションは、完全に機能します。

exeがテキストファイルを見つけられないのはなぜですか?

FILE* fileData;
if ((fileData = _tfopen(_T("Data.txt"), _T("r"))) == NULL)
    return false;
4

3 に答える 3

2

これを試してみてください。プログラムを呼び出しGetCurrentDirectory()て結果をどこかに出力し、プログラムの現在のディレクトリが本当にあなたが考えているものであることを確認できるようにします。OutputDebugString()デバッガーで実行している場合でも、そうでない場合でも使用できますMessageBox()

同じ場所にあるファイルを開いていることを確認する必要がある場合は、 を呼び出しGetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn))て EXE ファイルの FQN を取得し、EXE ファイル名を削除して、必要なファイルの名前を追加します。このように、間違っている可能性のある仮定を行っているわけではありません。結局のところ、EXE ファイルを含むディレクトリとは異なるプログラムの既定のディレクトリをショートカットに設定することは簡単なことです。

また、プログラムへのフル パスを入力してコマンド ラインからプログラムを実行する場合、プログラムの現在のディレクトリは、EXE が見つかったディレクトリではなく、実行したときのディレクトリになります。PATHこれは、環境変数を検索してプログラムが見つかった場合にも当てはまります (はい、Windows にはまだ存在します)。

あなたが説明したことを行うために私が10年以上使用してきたものの例を次に示します。

char szHelpFileName[_MAX_FNAME];
char *cp;

GetModuleFileName( NULL, szHelpFileName, sizeof(szHelpFileName) );
cp = strrchr( szHelpFileName, '\\' );
if( cp )
{
   cp++; // Point to the char just following the final slash.
}
else
{  // No backslash, is there a colon?
   cp = strrchr( szHelpFileName, ':' );
   if( cp )
   {
      cp++; // Point to the char just following the colon.
   }
   else
   {  // I give up.  I'll have no path information.
      cp = szHelpFileName;
   }
}
strcpy( cp, "program.hlp" );

最終結果は、EXE と同じ場所にあるヘルプ ファイルの名前です。ヘルプ ファイルが見つからない (またはそのアクセス許可が何らかの形で無効になっている) 場合を除き、これは常に機能します。コメントが「あきらめる」と言う「パラノイア」の道をたどったことは一度もありません。

于 2013-03-05T13:11:34.317 に答える
1

通常、オペレーティング システムは、実行可能な場所ではなく、現在のディレクトリに基づく相対アドレスでファイルを開きます。

たとえば、実行可能ファイルが に/path/to/exec/executableあり、それを から呼び出すと、であるかのよう/path/to/invokeに開こうとします。Data.txt/path/to/invoke/Data.txt

この質問とその回答を見て、Windows で実行可能ファイルへのパスを見つける方法を見つけることができます。または、他のさまざまなオペレーティングシステムに対するこの回答。

于 2013-03-05T13:12:27.137 に答える
0

フルパスを指定しなくても機能するはずです。Visual Studio から実行可能ファイルを起動しますか? はいの場合、Data.txt ファイルが *.vcxproj ファイルまたは *.sln ファイルがあるプロジェクト ディレクトリ内にあることを確認します。

于 2013-03-05T13:25:28.023 に答える