首页 > 解决方案 > 如何在不设置完整路径的情况下访问 C++ 中的资源

问题描述

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

标签: c++resources

解决方案


无论如何,如果你想访问一些资源,你必须知道路径。

如果您不想使用绝对路径(出于可移植性原因,我理解这一点),我认为您可以使用某种相对路径。

更清楚地说,简单地使用相对路径是不好的,因为正如一些程序员在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]路径的路径,它将始终有效。


推荐阅读