2016-07-24 14 views
-1

Ich versuche ein Programm zu schreiben, das einen OpenGL-Shader aus einer TXT-Datei einliest. Ich habe das schon vor ein paar Tagen gemacht, das war der Code den ich benutzt habe:Warum verhält sich ifstream read() in zwei verschiedenen Programmen anders?

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

Das hat super funktioniert. meine Shader-Datei war nicht wirklich nicht 2000, aber die read() Aufruf schien die zusätzlichen Zeichen als Leerzeichen in die Char-Array zu speichern, was ich wollte.

Jetzt ein wenig in einem neueren Programm meinen Code neu strukturiert hat, meine Leser sieht nun wie folgt aus:

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];  

Der eigentliche Textteil liest immer noch richtig. Aber jetzt der zusätzliche Platz in dem char-Array mit diesem anstelle von Leerzeichen gespeichert ist: enter image description here

Falls das Bild nicht zeigen, es ist im Grunde nur ein reapeating Muster dieser beiden Zeichen [|[|[|....

Warum passiert das und wie kann ich es beheben?

HINWEIS: Ich benutze die gleiche Shader-Datei, den gleichen Computer, die gleiche IDE, das gleiche alles. Der alte funktioniert noch.

+0

Nun, eine Sache, die anders ist, ist wie globale Arrays im Vergleich zu lokal zugewiesenen Arrays initialisiert werden. –

+0

@ πάνταῥεῖ ah yup das hat es getan. Ich habe gerade mein Array auf global geändert und es wurde mit Leerzeichen gefüllt. Vielen Dank. Sorry für solch eine dumme und einfache Frage, ich weiß nicht viel C++. Ich mache meistens java, –

+0

In C/C++ Instancing ein Skalartyp wird es nicht initialisieren (Leistungsgründe), so tun 'Int a;' in einer Funktion bedeutet, dass 'a' kann einen Wert (was war da auf dem Stapel). Globale Variablen sind eine Ausnahme, die initialisiert wurde, um den Standardwert einzugeben (für "int" ist es "0"). In Java erhalten Sie immer eine initialisierte Instanz von allem (das ist der Grund # 1234345, warum Java im Vergleich zu korrekt geschriebenem C/C++ langsam ist, und das ist im wirklichen Leben irrelevant, da fast niemand C/C++ schreiben kann (zumindest ich nicht) 't)) – Ped7g

Antwort

3

Bei Verwendung von std::istream:read() wird nicht die Teile des Puffers auf Leerzeichen gesetzt, die nicht gelesen wurden. Die Erinnerung bleibt unberührt. Wenn Sie Leerzeichen in einen ungelesenen Bereich des Puffers eingeben möchten, müssen Sie die Leerzeichen selbst dort ablegen. Wenn das Programm tatsächlich Leerzeichen im Puffer hatte, lag es daran, dass der Puffer irgendwie schon zufällig Leerzeichen enthielt.

Sie können std::istream::gcount() verwenden, um festzustellen, wie viele Zeichen gelesen wurden.

+0

danke, das hilft: D –

0

Wenn die Arrays vordefinierte Daten enthalten sollen, müssen Sie sie mit solchen vordefinierten Daten initialisieren. Wenn der Stream weniger Daten als die Array-Größe liest, haben Sie die gewünschte Auffüllung.

Verwandte Themen