Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_String_Visual Studio_Path_C++17 - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,string,visual-studio,path,c++17,C++,String,Visual Studio,Path,C++17,我正在Visual Studio中开发一个解决方案。它目前有两个项目 我会用大写字母表示目录或文件夹,文件名都是小写。我的解决方案结构如下: SolutionDir 项目库 源文件 着色器 着色器文件 ProjectApp 源文件 x64 调试 app.exe//调试生成 释放 app.exe//发布版本 在ProjectLib中,我有一个打开和读取着色器文件的功能。下面是我的函数的外观: std::vector<char> VRXSha

我正在Visual Studio中开发一个解决方案。它目前有两个项目

我会用大写字母表示目录或文件夹,文件名都是小写。我的解决方案结构如下:

  • SolutionDir
    • 项目库
      • 源文件
      • 着色器
        • 着色器文件
    • ProjectApp
      • 源文件
    • x64
      • 调试
        • app.exe//调试生成
      • 释放
        • app.exe//发布版本
ProjectLib
中,我有一个打开和读取着色器文件的功能。下面是我的函数的外观:

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;       
}
正在从my
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_);
    
}
我正试图找出合适的字符串来初始化
filename
<代码>着色器/将是名称的一部分,但它找不到文件,我不确定适当的前缀应该是什么

我在这两个项目中的工作目录如下:

  • ProjectApp->$(SolutionDir)x64/Release和$(SolutionDir)x64/Debug
  • ProjectLib->$(SolutionDir)x64/Release和$(SolutionDir)x64/Debug
所以我需要返回2个目录,然后进入
VRX引擎/Shader

向后导航目录的正确字符串值是多少


我是用
“../../VRX引擎/Shaders/”
初始化
文件名
,还是它是
“/”
呢?由于文件夹名中有空格,我应该在
VRX引擎
周围加引号吗?在将
着色器名称
附加到它之前,我需要用什么初始化
文件名

在将
字符串视图
附加到它之前,我最初是用
“/../VRX引擎/Shaders/”
正确初始化我的本地temp
字符串
,以便能够打开文件。这实际上是正确的,但因为它最初不起作用,我认为它是错误的

返回一个目录的正确字符串值应该是
。/“
至少在
Windows
上,我不确定
Linux
Mac
Android
等等

我的问题根本不是字符串,而是项目中的设置。在构建到可执行文件中的项目中,我将其工作目录分别设置为
$(SolutionDir)x64/Debug
$(SolutionDir)x64/Release
,这对于我的解决方案结构是正确的

问题出在我的
引擎
项目中,该项目正在构建一个静态库。在其工作目录的设置中,我忘记了修改
Debug
Release
构建选项。。。这些仍然设置为VisualStudio的默认值,我相信是
(ProjectDir)
。一旦我将它们更改为
$(SolutionDir)x64/Debug
$(SolutionDir)x64/Release
,以匹配我的
应用程序项目
,我就能够打开并读取文件的内容

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

这取决于您的实现要求遵循的C++标准。 或者您可以使用哪些附加库。

C++在没有目录的计算机上是有用的(例如,在C++中编译的一些操作系统内核中编译,见例子)。 留意细节。 使用额外的库时,许可限制可能很重要

如果您的实现符合C++17(以“托管”而不是“独立”的方式),请使用标准库的一部分

如果您的操作系统支持或框架,并且允许您使用它们(例如在C++11上),则可以使用适当的API。So和相关类与Qt以及相关类与POCO


也许您只想为应用程序编写代码。然后读一读(我自己从来没有在Windows上编码过,只在POSIX或Unix上编码过,例如Linux和MSDOS…)

我花了很多时间尝试和错误。。。但是我最终能够用
。/../VRX引擎/Shaders/
打开文件。导致它失败的问题与我的
LibProject
或作为静态库构建的
VRX引擎
项目的设置有关。在作为可执行文件构建的
应用程序中,我有相应的
工作路径
目录。我忘记将
LibProject
的工作目录更新或修改为相同的。。。这就是为什么它不工作,找不到或打开文件!我很高兴您得到了您的解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。@BarrnetChou我必须等待2天才能接受我自己的答案!我感谢你的反馈。我确实理解
std::filesystem
是可用的,并且是C++17标准的一部分,但是,这不是我问题的重点。它指的是正确的字符序列或
字符串
,用于在文件夹或目录中导航。我正在使用visualstudio在Windows机器上构建并测试我的函数。一旦我得到了Vulkan的框架和样板代码来绘制一个简单的三角形,我就可以回去重构它,使它以跨平台的方式可移植。而且,我实际上不需要使用
std::filesystem
,所以我必须创建一些测试项目来适应它的接口和内部工作。
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_);
    
}
std::string filename = std::string("Shaders/");
filename.append(shadername);