我正在尝试在大型代码中打开文件。
有人告诉我,在处理文件时,使用绝对路径而不是相对路径可能是更好的做法。但是这个代码将由不同的人使用,他们可能将源放在不同的地方(例如/ home / username,或/ home / username / desktop /),所以我认为使用相对路径可能更好访问我的配置文件,因为我知道它与我的cpp文件的关系。
以下是与我的问题相关的文件位置的简短总结:
我想要阅读的文件是/home/me/myproject/config/myfile.txt
我正在阅读的文件是/home/me/myproject/src/myfile.cpp
包含'main'的文件也是/home/me/myproject/src/myfile.cpp(这个文件很大)。
我正在从eclipse启动可执行文件。我认为eclipse将工作目录设置为'main'所在的目录(/ home / me / myproject / src /)。
我很困惑的事实是,当我要调用file.open()时,工作目录(getcwd())现在是/ home / me / myproject /。显然工作目录是由main()和我对file.open()的调用之间的代码修改的。
我的问题是:如果可以通过程序的其他部分进行更改,那么依赖于工作目录似乎非常容易出错。另一方面,考虑到我不知道其他开发人员通常把他们的资源放在哪里,我怎么知道我的配置路径在哪里呢?
答案 0 :(得分:2)
我正在从eclipse启动可执行文件。我认为eclipse设定了 工作目录到'main'所在的目录 (/家/我/ myproject的/ src目录/).
你确定吗?在我看来,它是项目文件夹的顶层(即“/ home / eclipse / myproject”,而不是“/ home / eclipse / src”。这可以解释原因:
工作目录(getcwd())现在是/ home / me / myproject /.
还有别的什么吗?它不太可能“被程序的另一部分改变”,除非你明确地做了一些事情来引起这种情况。
我不清楚您是否理解源代码和可执行文件之间的区别。您的源代码文件未“运行”。它被编译成可执行文件,这就是运行的。使用eclipse,这些默认情况下放入Release /或Debug /(看看),而不是src /目录。 eclipse使用toplevel目录的(可推测的)原因是这些版本之间的一致性,因此你可以,例如,相对于那个输出。
我的问题是:看起来很容易依赖于工作 目录,
无论如何,这绝对是正确的。有特定于操作系统的方法来获取用户主目录的路径。您应该得到它,并在文档中指定要保留配置的位置。如果用户不能正确地做到这一点,那不是你的错 - 而是发出信息性的信息,例如。 “找不到配置文件!”。
我怎么知道我的配置路径在哪里 鉴于我不知道其他开发者通常放在哪里 他们的来源?
请注意,“其他开发者”根本不一定包含源,因为不需要运行可执行文件。
答案 1 :(得分:-1)
接受文件位置作为参数总是一个好主意,因此使用您的软件的人可以毫不费力地尝试不同的配置。
您总能做的是弄清楚当前正在运行的二进制文件的位置。如果找不到直接方式,请使用getcwd()
和argv[0]
的组合。如果进程没有自行更改,则在运行命令后,工作目录不更改。
然后,您可以截断文件名并将配置文件的名称附加到路径(存储在以下示例中的字符串base
中)。
以下是一些代码,用于确定路径是绝对路径还是相对路径,并相应地附加路径。您需要boost_filesystem
才能实现跨平台:
#ifdef WITH_BOOST_FILESYSTEM
boost::filesystem::path basepath(base), filepath(filename);
if (!basepath.is_complete()) {
basepath = filepath.remove_leaf() /= basepath;
base = basepath.string();
}
#elif __unix__
if (base[0] != '/') {
char *f = strdup(filename.c_str()), *d = dirname(f);
base = string(d).append("/").append(base);
free(f);
}
#else
std::cerr << "Warning: only absolute file paths accepted." << std::endl;
#endif
base.append("/");