在C ++中从文件读取会导致空字符串“有时”

时间:2019-09-09 08:32:49

标签: c++

我知道这个“有时”有点违反堆栈溢出的规则,但是我不知道如何更好地描述我的问题:

我有此代码:

static const std::string parseShader(const std::string &fileName){
std::ifstream ifs(fileName);
std::stringstream buffer;
buffer << ifs.rdbuf();
std::string s = buffer.str();
return s;

}

在我的主要功能中,我有以下代码:

const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
const char* vertex_shader_text = parseShader("res/shaders/basic.vertex.glsl").c_str();
std::cout << "Vertex shader length is " << strlen(vertex_shader_text) << std::endl;
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
glCompileShader(vertex_shader);

const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
const char* fragment_shader_text = parseShader("res/shaders/basic.fragment.glsl").c_str();
std::cout << "Fragment shader length is " << strlen(fragment_shader_text) << std::endl;
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
glCompileShader(fragment_shader);

因此,如果我执行程序而没有移动文件或更改任何代码,有时会得到:

Vertex shader length is 160
Fragment shader length is 90

有时:

Vertex shader length is 0
Fragment shader length is 0

甚至大部分时间

Vertex shader length is 160
Fragment shader length is 0

因此,似乎文件读取的某些部分将是异步的,并且比程序的其余部分要慢。我正在使用C ++ 17,CLion和MacOS Mojave,作为其他信息。...

此外,当正确读取两个文件时,opengl(三角形)中的图像会正确绘制,但是当某些文件未正确读取时,则不会显示任何内容。

1 个答案:

答案 0 :(得分:4)

问题在于该函数返回的字符串对象是 temporary ,并且将几乎立即终止其生命周期。这将为您提供一个指向不再存在的字符串的指针。

改为使用std::string作为目的地,并且仅在绝对需要时才使用c_str成员函数来获取指针。