gpt4 book ai didi

c++ - 如何在C++中正确导航目录路径

转载 作者:行者123 更新时间:2023-12-02 10:11:36 24 4
gpt4 key购买 nike

我正在Visual Studio中解决方案。目前有两个项目。
我将用大写字母表示目录或文件夹,文件名将全部使用小写字母。我的解决方案结构如下:

  • 解决方案目录
  • ProjectLib
  • 源文件
  • 着色器
  • 着色器文件


  • ProjectApp
  • 源文件

  • x64
  • 调试
  • app.exe //调试生成

  • 发布
  • app.exe //发布内部版本




  • ProjectLib中,我具有打开和读取我的Shader文件的功能。这是我的函数:
    std::vector<char> VRXShader::readFile(std::string_view shadername) {
    std::string filename = std::string("Shaders/");
    filename.append(shadername);

    std::ifstream file(filename.data(), std::ios::ate | std::ios::binary);

    if (!file.is_open()) {
    throw std::runtime_error("failed to open file!");
    }

    size_t fileSize = static_cast<size_t>(file.tellg());
    std::vector<char> buffer(fileSize);

    file.seekg(0);
    file.read(buffer.data(), fileSize);

    file.close();

    return buffer;
    }
    此函数在我的 VRXDevices::createPipeline函数中被调用,下面是相关代码:
    void VRXDevices::createPipeline(
    VkDevice device, VkExtent2D swapChainExtent, VkRenderPass renderPass,
    const std::vector<std::string_view>& shaderNames,
    VkPipelineLayout& pipelineLayout, VkPipeline& pipeline
    ) {
    std::vector<std::vector<char>> shaderCodes;
    shaderCodes.resize(shaderNames.size());

    for (auto& name : shaderNames) {
    auto shaderCode = VRXShader::readFile(name.data());
    }

    // .... more code
    }
    名称是从我的 VRXEngine::initVulkan函数创建并传递到此函数的,可以在此处看到:
    void VRXEngine::initVulkan(
    std::string_view app_name, std::string_view engine_name,
    glm::ivec3 app_version, glm::ivec3 engine_version
    ) {
    //... code

    std::vector<std::string_view> shaderFilenames{ "vert.spv", "frag.spv" };
    VRXDevices::createPipeline(device_, swapChainExtent_, renderPass_, shaderFilenames, pipelineLayout_, graphicsPipeline_);

    }
    我仅使用着色器文件的名称,例如 vert.spvfrag.spvgeom.spv等。这里不包括路径,因为这些路径将用作 std::map<string_view, object>的键。因此,我将这些名称的 vector 从 ::initVulkan函数传递到 ::createPipeline()中。
    ::createPipeline()中,传递 ::readFile()的地方称为 string_view
    现在关于我的问题...在 ::readFile()中,我正在创建本地 string,并尝试使用适当的路径对其进行初始化...,然后将着色器文件名的 string_view附加到其上,从这两行可以看出...
    std::string filename = std::string("Shaders/");
    filename.append(shadername);
    我正在尝试找出适当的字符串来使用...来初始化 filename ... Shaders/将是名称的一部分,但找不到文件,而且不确定是否应该使用适当的前缀...
    我在两个项目中的工作目录如下:
  • ProjectApp-> $(SolutionDir)x64 / Release和$(SolutionDir)x64 / Debug
  • ProjectLib-> $(SolutionDir)x64 / Release和$(SolutionDir)x64 / Debug

  • 所以我需要回到2目录然后到 VRX Engine/Shader ...
    导航回目录的正确字符串值是什么?
    我应该用 filename初始化 "../../VRX Engine/Shaders/"还是 "././",因为文件夹名称中有空格,我是否应该在 VRX Engine周围加上引号?在将 filename附加到 shader name之前,需要使用什么进行初始化?

    最佳答案

    How to properly navigate directory paths in C++


    这取决于您的实现声称符合哪个C++标准。
    否则,您可以使用哪些其他库。
    C++在没有目录的计算机上很有用(例如在某些用C++编码并使用 GCC编译的操作系统内核中,请参阅 OSDEV)。
    查看 en.cppreference.com以获得详细信息。
    使用额外的 open source库时,许可约束可能很重要。
    如果您的实现是C++ 17兼容的(以“托管”而不是“独立”的方式),请使用标准库的 std::filesystem 部分。
    如果您的操作系统支持 QtPOCO框架,并且允许您使用它们(例如在C++ 11上),则可以使用适当的API。因此, QDir 和带有Qt的相关类, Poco::Path 和带有POCO的相关类。
    也许您只想为 WinAPI编写代码。然后阅读 its documentation(我从未在Windows上自己编写过代码,而从未在POSIX或Unix上编写过代码,例如Linux-和MSDOS ...)。

    关于c++ - 如何在C++中正确导航目录路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63334095/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com