我希望以编程方式访问我的资源,但我不想使用包含C:\ Users \ USER_EXAMPLE \ ...的完整路径。 在Java中,可以使用getClass.getResources(“ Folder / test.txt”); 我想做的是读取和写入文件。而且效果很好。但是我只是想知道如果您在另一台PC上执行该程序将无法正常工作。因为它不检测文件。
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);```
答案 0 :(得分:0)
无论如何,如果您想访问一些资源,则必须知道路径。
如果您不想使用绝对路径(出于可移植性的原因,我理解这一点),我认为您可以使用某种相对路径。
更明确地说,仅使用相对路径是不好的,因为正如 Eric 的回答一些程序员伙计所述,相对路径是相对于工作目录的。因此,如果从位置目录以外的其他目录启动可执行文件,则相对路径将被破坏。
但是有解决方案:
如果使用main()
参数,则可以获得可执行位置的绝对路径。
实际上,argv[0]
包含被调用的命令,它是: absolute_path / executable_name 。您只需要删除可执行文件名称,就可以获取可执行文件文件夹的绝对路径。
现在,您可以使用与此相对的路径。
它可能如下所示:
#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;
}
我认为它将为您提供帮助。
编辑:
实际上,如上所述,argv[0]
包含被调用的命令。因此,严格来说,它不一定是可执行文件的“绝对路径”。
确实,如果从具有相对路径的控制台/终端调用可执行文件,则argv[0]
将得到此结果。
但是无论如何,路径解析问题会在调用时解决,因此,如果我们使用相对于给定argv[0]
路径的路径,它将始终有效。