2

プログラムでは、実行時にファイルを開きfile.datます。問題は、実行可能ファイルを実行すると、ファイルが実行されたディレクトリにあることを期待していることです。プログラムに、実行可能ファイルが存在するのと同じディレクトリを調べてもらいたい。プログラム(またはビルドシステム)でどのような変更を加える必要がありますか。

たとえば、次のプログラムについて考えてみます。

int main()
{
std::ifstream ip("file.dat");
// do something.


return 0;
}

私はg++-4.6コンパイラとCMakeビルドシステムを使用してUbuntuに取り組んでいます。cmakeプロジェクトはアウトオブソースビルドをサポートしているため、プログラムの実行可能ファイルは、が呼び出されたディレクトリに応じてどこにでも配置できます。

助けてくれてありがとう...

4

2 に答える 2

1

多くのシステムでは、argv[0]パラメーターにはプログラムの実行に使用されるパスが含まれます。これがプログラムのフル パスであるかどうかは、その呼び出し方法によって異なります。

int main (int argc, char *argv[]) {
    std::string progname(argv[0]);
    std::string datafile;
    if (progname.find_last_of('/') != std::string::npos)
        datafile = progname.substr(0, progname.find_last_of('/')+1);
    datafile += "file.dat";
    std::ifstream ip(datafile.c_str());
    //...
}
于 2012-06-28T17:39:23.750 に答える
1

Linux では /proc/self/exe を読むのが最善の方法です。

  char app_path[1024];
  ssize_t len = ::readlink("/proc/self/exe", app_path, sizeof(app_path)-1);
  if (len != -1) {
    app_path[len] = '\0';
  } else {
    // handle error
  }

その他の OS については、https ://stackoverflow.com/a/1024937/105015 を参照してください。

于 2012-06-28T17:48:13.513 に答える