2016-07-24 68 views
-1

我想写一个程序,读取一个.txt文件中的OpenGL着色器。前几天我已经这样做了,这是我使用的代码:为什么ifstream read()在两个不同的程序中表现不同?

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

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

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

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

+0

好吧,有一点不同的是全局数组是如何初始化的,而不是本地分配的。 –

+0

@πάνταῥεῖ啊哟,做到了。我只是将我的数组更改为全局,并填充了w /空格。谢谢。对不起,这样一个愚蠢和简单的问题,我不知道太多的C++。我主要做java, –

+0

在C/C++实例中,标量类型不会初始化它(性能的原因),所以在函数中使用'int a;'意味着'a'可以有任何值(堆栈中有什么值)。全局变量是异常,初始化为类型默认值('int'为'0')。在Java中,您将始终接收所有事物的初始化实例(这就是原因#1234345与正确编写的C/C++相比,Java为什么很慢,而且在现实生活中这与实际情况无关,因为几乎没有人知道编写适当的C/C++(至少我不会't)) – Ped7g

回答

3

当使用std::istream:read()它会而不是将缓冲区的部分设置为未读取的空间。内存将保持不变。如果你想让空间进入缓冲区的未读区域,你需要把空间放在那里。如果程序确实在缓冲区中有空格,那是因为缓冲区偶然已经包含了空格。

您可以使用std::istream::gcount()来确定读取了多少个字符。

+0

谢谢,这有助于:D –

0

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

相关问题