为什么ifstream read()在两个不同的程序中表现不同?

时间:2016-07-24 00:10:40

标签: c++ file-io ifstream

我正在尝试编写一个从.txt文件中读入OpenGL着色器的程序。我几天前已经做过这个,这是我用过的代码:

char vShaderData[2000];
char fShaderData[2000];
void readShaders() {
    std::ifstream vShaderF;
    std::ifstream fShaderF;
    vShaderF.open("shaders//vertexShader.txt");
    fShaderF.open("shaders//fragShader.txt");
    if (vShaderF.is_open() && fShaderF.is_open()) std::cout << m << "Shader read success" << std::endl; 
    else std::cout << "Shader read fail" << std::endl; 
    std::cout << m << "vertex shader: " << std::endl;
    vShaderF.read(vShaderData, 2000);
    for (int i = 0; i < 2000; i++) {
        std::cout << vShaderData[i];
    }
    std::cout << std::endl << std::endl;
    std::cout << m << "frag shader: " << std::endl;
    fShaderF.read(fShaderData, 2000);
    for (int i = 0; i < 2000; i++) {
        std::cout << fShaderData[i];
    }
    std::cout << std::endl;
    vShaderF.close();
    fShaderF.close();
}

这很有效。我的着色器文件实际上并不是2000的长度,但read()调用似乎将额外的字符作为空格存储到char数组中,这就是我想要的。

现在我已经在一个较新的程序中重新构建了我的代码,我的读者现在看起来像这样:

    std::ifstream shaderFile;
    shaderFile.open(path);  
    if (shaderFile.is_open()) cout << "Shader at: " << path << ", initalized" << endl;
    char data[2000];
    shaderFile.read(data, 2000);

    for (int i = 0; i < 2000; i++) std::cout << data[i];    

实际文本部分仍然正确。但是,现在char数组中的额外空间与此存储而不是空白: enter image description here

如果图像不显示,它基本上只是这两个字符[|[|[|...的重新模式。

为什么会发生这种情况,我该如何解决?

注意:我使用相同的着色器文件,相同的计算机,相同的IDE,所有内容都相同。旧的仍然有效。

2 个答案:

答案 0 :(得分:3)

使用std::istream:read()时,将缓冲区的部分设置为未读取的空格。记忆将保持不变。如果要将空格放入缓冲区的未读区域,则需要自己放置空格。如果程序确实在缓冲区中有空格,那是因为缓冲区在某种程度上已经包含了空格。

您可以使用std::istream::gcount()来确定已读取的字符数。

答案 1 :(得分:0)

如果您希望数组包含预定义数据,则必须使用此类预定义数据对其进行初始化。如果流读取的数据少于数组大小,则将获得所需的填充。