如何在不设置完整路径的情况下使用c ++访问资源

时间:2019-08-23 12:32:19

标签: c++ resources

我希望以编程方式访问我的资源,但我不想使用包含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);```

1 个答案:

答案 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]路径的路径,它将始终有效。