我正在尝试硬编码到C ++程序中,在与可执行文件相同的目录中查找config.ini,而不知道文件的完整路径。我试图找到一种方法来对可执行文件进行本地引用。
基本上加载(“./ config.ini”) 没有做
( “C:\ FOO \条\的config.ini”)
答案 0 :(得分:2)
实际上没有任何保证可移植的方式,但我喜欢使用此代码,因为它适用于绝大多数情况(除非涉及符号链接或其他魔法):
boost::filesystem::current_path(boost::filesystem::path(argv[0]).remove_filename());
如果您愿意使用特定于平台的代码,请查看Windows上的GetModuleFileName
以及getpid
的混合内容,并在Linux上阅读/proc
和readlink
。
答案 1 :(得分:1)
Windows上需要GetModuleFilename()
(传递NULL以获取当前可执行文件的文件名)。否则,请在程序的早期调用boost::filesystem::initial_path()
(请参阅链接中的Boost docs以了解提前执行此操作的原因)。这应该涵盖大多数情况。
修改强>
脑功能障碍。我们总是从可执行文件的目录开始我们的程序,所以boost::initial_path()
的东西有效,但是如果你从另一个目录启动程序它将无法正常工作。对不起,对此感到困惑。但是,在Windows上,我会从GetModuleFilename
获取路径并使用boost::path
来操作结果。
答案 2 :(得分:0)
对于Windows,这将获得包含可执行文件的目录作为c ++字符串:
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;;
string ExePath() {
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
string::size_type pos = string( buffer ).find_last_of( "\\/" );
return string( buffer ).substr( 0, pos);
}
然后,您可以在最后标记配置文件的名称。
答案 3 :(得分:-1)
对于Windows:
#include <direct.h>
char cur_path[FILENAME_MAX];
if (!_getcwd(cur_path, sizeof(cur_path)))
{
// deal with error
}
cur_path[sizeof(cur_path) - 1] = '/0'; // adding \0 at the end of the string
printf("Current dir: %s", cur_path);
这里讨论了与平台无关的解决方案: