运行时查找文件路径

3
在程序中,我在运行时打开一个名为file.dat的文件。问题是当我运行可执行文件时,它期望文件在执行它的目录中。我希望程序查找与可执行文件相同的目录。我应该对我的程序(或构建系统)进行哪些修改?
例如,考虑以下程序:
int main()
{
std::ifstream ip("file.dat");
// do something.


return 0;
}

我正在使用g++-4.6编译器和CMake构建系统在Ubuntu上工作。由于该项目支持源外构建,这意味着程序可执行文件可以位于任何位置,具体取决于从哪个目录调用了cmake
感谢您的帮助...
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());
    //...
}

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
  }

对于其他操作系统,请参见:https://dev59.com/mHNA5IYBdhLWcg3wS7sm#1024937


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接