我希望在程序中访问我的资源,但我不想使用包括 C:\Users\USER_EXAMPLE\... 的完整路径
在 java 中,可以选择使用 getClass.getResources("Folder/test.txt");
我想做的事情是读取和写入文件。而且效果很好。但我只是想知道如果你在另一台电脑上执行该程序,它将无法工作。因为它没有检测到该文件。
string path = "C:\\Users\\USER_EXAMPLE\\source\\repos\\Console\\Console\\Data.txt";
inFile.open("C:\\Users\\USER_EXAMPLE\\source\\repos\\Console\\Console\\Data.txt");
inFileWrite.open(path, ios_base::app);```
无论如何,如果你想访问某些资源,你就必须知道路径。
如果您不想使用绝对路径(这是我出于可移植性原因而理解的),我认为您可以使用相对路径。
更清楚地说,简单地使用相对路径是不好的,因为,一些程序员老兄发表评论于Eric的答案,相对路径是相对于工作目录的。因此,如果从其位置目录之外的其他目录启动可执行文件,则相对路径将被破坏。
但有一个解决方案:
如果您使用main()
参数,可以获得可执行位置的绝对路径。
实际上,argv[0]
包含被调用的命令:绝对路径/可执行文件名称。您只需删除可执行文件名称,即可获得可执行文件夹的绝对路径。
您现在可以使用相对于该路径的路径。
它可能如下所示:
#include <string>
int main(int argc, char ** argv)
{
// Get the command
const std::string called_cmd = argv[0];
// Locate the executable name
size_t n = called_cmd.rfind("\\"); // Windows
//size_t n = called_cmd.rfind("/"); // Linux, ...
// Handle potential errors (should never happen but it is for robustness purposes)
if(n == std::string::npos) // if pattern not found
return -1;
// Remove the executable name
std::string executable_folder = called_cmd.substr(0, n);
// ...
return 0;
}
我想这会对你有帮助。
EDIT:
事实上,正如已经提到的,argv[0]
包含被调用的命令。因此严格来说,它不一定是可执行文件的“绝对路径”。
事实上,如果可执行文件是从具有相对路径的控制台/终端调用的,则这就是argv[0]
会得到。
但无论如何,路径解析问题在调用时就得到了解决,因此,如果我们使用相对于给定的路径,它将始终有效argv[0]
path.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)