【问题标题】:Reading from a file to a string doesn't work as expected从文件读取到字符串不能按预期工作
【发布时间】:2014-04-05 16:04:51
【问题描述】:

我目前正在用 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* 包含正确的代码(我刚刚转换为字符串的文件中的内容)。

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

我希望有人能弄清楚。 非常感谢。

【问题讨论】:

  • 你正在使用一个临时的 c_str(),它变成了垃圾

标签: c++ opengl io


【解决方案1】:

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

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

引用标准:

临时对象在评估完整表达式 (1.9) 的最后一步时被销毁,完整表达式 (1.9) 包含它们的创建点。

修复很简单:

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();

【讨论】:

  • 虽然我得到了临时表达式范围背后的想法,但它似乎并没有起到作用。 vertexShader 的变量保持为空,而 fragmentShader 包含正确的字符串...顺便说一句,我很确定这是我在编码时做的一些愚蠢的事情,我只是找不到错误。
  • 好的,看来OpenGL部分还有另一个问题我必须弄清楚。你的方法效果很好;)
【解决方案2】:

改变这个:

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

到这里:

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

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2011-05-17
    • 2020-01-11
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多