我正在使用OpenGL做一些实验,并且正在尝试加载着色器。它需要const char *中的源,但是由于我是在C ++上执行的,因此我可以使用std :: strings然后调用str.c_str()。那不是问题-当我尝试读取文件时,它读起来很完美,但是返回的值是损坏的字符串。这是代码的相关部分:
// inline method on engine.hpp
inline void readFile(std::string filePath, std::string* retValue)
{
std::ifstream file;
file.open(filePath);
std::string result;
std::string line;
while (!file.eof())
{
std::getline(file, line);
result.append(line + "\n");
}
memcpy(retValue, &result, sizeof(result));
}
// implemented method on engine.cpp
GLint Engine::createShader(std::string vs, std::string fs)
{
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
std::string vsSourceStr = "";
std::string fsSourceStr = "";
readFile(vs, &vsSourceStr);
readFile(fs, &fsSourceStr);
const char* vsSource = vsSourceStr.c_str();
const char* fsSource = fsSourceStr.c_str();
//std::string t_vs = readFile(vs);
//const char* vsSource = readFile(vs).c_str();
//const char* fsSource = readFile(fs).c_str();
glShaderSource(vertex, 1, &vsSource, NULL);
glCompileShader(vertex);
glShaderSource(fragment, 1, &fsSource, NULL);
glCompileShader(fragment);
GLint program = glCreateProgram();
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
if (shaderCompiled(program))
{
std::cout << "shader successfully compiled" << std::endl;
}
else
{
std::cout << "shader not compiled" << std::endl;
printShaderError(vertex);
printShaderError(fragment);
std::cout << "Vertex Shader source:" << std::endl;
std::cout << vsSource << std::endl;
std::cout << "Fragment Shader source:" << std::endl;
std::cout << fsSource << std::endl;
}
return program;
}
这是Visual Studio在调试时所说的:http : //prntscr.com/4qlnx7
它完美地读取文件,只是使返回值崩溃。我已经尝试过使用引用和复制内存来返回结果,正如您在我的代码中看到的那样。不管怎么说,还是要谢谢你。
这不会按照您的想法进行:
std::string line;
while (!file.eof())
{
std::getline(file, line);
result.append(line + "\n");
}
请用:
std::string line;
while (std::getline(file, line))
{
result.append(line + "\n");
}
原因是eof()
直到读取文件后才触发。这意味着您std::getline()
可能已经失败(在EOF时),并且您正在使用该错误数据。
请参阅: C ++ FAQ 15.5有关eof()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句