gpt4 book ai didi

c++ - 从文件读取到字符串无法按预期工作

转载 作者:行者123 更新时间:2023-11-28 00:31:10 25 4
gpt4 key购买 nike

我目前正在用 OpenGl 和 C/C++ 编写我的第一个程序。我遇到了以下问题:

我编写了一个读取文件(在我的例子中包含顶点或片段着色器)并将内容作为一个字符串返回的方法。

std::string loadShader(const char* filepath)
{
if(filepath){

std::ifstream ifs(filepath, std::ifstream::in);
std::ostringstream oss;
std::string temp;

while(ifs.good()){

getline(ifs, temp);
oss << temp << '\n';
std::cout << temp << std::endl;

}
ifs.close();
return oss.str();

}
else{
exit(EXIT_FAILURE);
}
}

我有两个文件:vertexShader.glsl 和 fragmentShader.glsl,我想将其转换为两个单独的字符串以创建着色器。上面的代码按以下方式调用:

void createShaders(void){

GLenum errorCheckValue = glGetError();

const GLchar* vertexShader = loadShader("vertexShader.glsl").c_str();
const GLchar* fragmentShader = loadShader("fragmentShader.glsl").c_str();

vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderId, 1, &vertexShader, NULL);
glCompileShader(vertexShaderId);

fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderId, 1, &fragmentShader, NULL);
glCompileShader(fragmentShaderId);

// some other code follows...
}

我调试了上面的代码,注意到 vertexShader const char* 是空的,而 fragmentShader const char* 包含正确的代码(我的文件中的内容只是转换为字符串)。

我不明白方法中的不一致之处。我想不通,一个着色器是如何以正确的方式解析的,而另一个是空的。

我希望有人能解决这个问题。非常感谢。

最佳答案

问题是从 loadShader() 返回的未命名的 std::string 只存在于表达式的范围内:

const GLchar* vertexShader = loadShader("vertexShader.glsl").c_str();

引用标准:

Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created.

修复很简单:

const std::string vertexShaderStr = loadShader("vertexShader.glsl");
const GLchar *vertexShader = vertexShaderStr.c_str();
const std::string fragmentShaderStr = loadShader("fragmentShader.glsl");
const GLchar *fragmentShader = fragmentShaderStr.c_str();

关于c++ - 从文件读取到字符串无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883278/

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