C++ 如何在C++;
我正在Visual Studio中开发一个解决方案。它目前有两个项目 我会用大写字母表示目录或文件夹,文件名都是小写。我的解决方案结构如下: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
- 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;
}
正在从myVRXEngine::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
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);