在程序中,我在运行时打开一个文件file.dat
。问题是当我运行可执行文件时,它希望文件位于执行它的目录中。我希望程序查看可执行文件所在的同一目录。我应该在程序(或构建系统)中进行哪些修改。
例如,考虑一下这个程序:
int main()
{
std::ifstream ip("file.dat");
// do something.
return 0;
}
我正在使用g ++ - 4.6编译器和CMake构建系统在Ubuntu上工作。由于项目支持源外构建,这意味着程序可执行文件可以位于任何位置,具体取决于调用cmake
的目录。
感谢您的帮助...
答案 0 :(得分: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 :(得分: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://stackoverflow.com/a/1024937/105015