2016-07-24 76 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

如果您希望數組包含預定義數據,則必須使用此類預定義數據對其進行初始化。如果數據流讀取的數據量少於數組大小,則您將擁有所需的填充。

相關問題