ifstream: hieroglyphen beim einlesen einer Binärdatei



  • Hallo zusammen,

    ich möchte gerne eine einfache Binärdatei einlesen. Der Inhalt ist GLSL-Code. Jedoch stehen am Ende des Strings immer komische hieroglyphen.

    void main() {            
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    }
    

    Im Debugger steht:

    void main() {            
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    }
    ÍÍÍÍýýýý««««««««þ
    
    GLchar* Shader::readShader(std::string path) {
    	std::ifstream inputStream;
    	GLchar* input = 0;
    	inputStream.open(path, std::ios::in);
    	if(inputStream.good()) {
    		inputStream.seekg(0, std::ios_base::end);
    		GLuint size = inputStream.tellg();
    		inputStream.seekg(0, std::ios_base::beg);
    		input = new GLchar[size];
    		inputStream.read(input, size);
    
    		std::cout << std::endl << "[OK] Loading Shader <" << path << ">" << std::endl;
    	} else {
    		std::cerr << std::endl << "[ERROR] Loading Shader <" << path << ">" << std::endl;
    	}
    	return input;
    }
    


  • Lasse mich raten die Hieroglyphen sind immer anders?
    Das liegt daran weil read() kein Nullbyte an den String einfügt.
    Es wird alles als String interpretiert bis irgendwann eine Null im Speicher steht.
    Das sind deine Hieroglyphen.
    Ich würde außerdem kein read() verwenden sondern die ganze Datei normal einlesen und in einem C++-String speichern.



  • Nathan schrieb:

    Lasse mich raten die Hieroglyphen sind immer anders?

    Nein, die sind immer gleich.



  • OK, dann ist immer der gleiche Speicher nach input.
    Trotzdem fehlt da das Nullbyte.

    GLchar* Shader::readShader(std::string path) {
        std::ifstream inputStream;
        GLchar* input = 0;
        inputStream.open(path, std::ios::in);
        if(inputStream.good()) {
            inputStream.seekg(0, std::ios_base::end);
            GLuint size = inputStream.tellg();
            inputStream.seekg(0, std::ios_base::beg);
            input = new GLchar[size + 1]; // Ein Zeichen mehr für das Nullbyte
            inputStream.read(input, size);
            input[size] = 0; // Nullbyte anfügen
    
            std::cout << std::endl << "[OK] Loading Shader <" << path << ">" << std::endl;
        } else {
            std::cerr << std::endl << "[ERROR] Loading Shader <" << path << ">" << std::endl;
        }
        return input;
    }
    

    So, probiere das mal. 😉



  • Nein der Code klappt leider auch nicht. Ich habe ein bisschen rumprobiert und mit diesem Code kann ich zumindest den Vertexshader einlesen und kompilieren aber der Fragementshader hat mit diesem Code immer noch hieroglyphen.

    Hier dein etwas abegewandelter Code:

    GLchar* Shader::readShader(std::string path) {
    	std::ifstream inputStream;
    	GLchar* input = 0;
    	inputStream.open(path, std::ios::in);
    	if(inputStream.good()) {
    		inputStream.seekg(0, std::ios_base::end);
    		GLuint size = inputStream.tellg();
    		inputStream.seekg(0, std::ios_base::beg);
    		input = new GLchar[size + 1];
    		inputStream.read(input, size);
    		input[size-2] = 0;
    
    		std::cout << std::endl << "[OK] Loading Shader <" << path << ">" << std::endl;
    	} else {
    		std::cerr << std::endl << "[ERROR] Loading Shader <" << path << ">" << std::endl;
    	}
    	return input;
    }
    

    Vertexshader:

    void main() {            
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    }
    

    Fragmentshader:

    uniform sampler2D textureSampler;
    
    void main() {
    	//gl_FragColor = texture2D(textureSampler, vec2()gl_TexCoord[0]);
    	gl_FragColor = vec4(1.0);
    }
    

    Debuggerausgabe des Fragmentshaders:

    uniform sampler2D textureSampler;
    
    void main() {
    	//gl_FragColor = texture2D(textureSampler, vec2()gl_TexCoord[0]);
    	gl_FragColor = vec4(1.0);
    }ÍÍÍ
    


  • Ersetze

    inputStream.open(path, std::ios::in);
    

    durch

    inputStream.open(path, std::ios::binary);
    

    und mache die Änderungen was das Nullbyte betrifft wieder rückgängig.
    read() hätte nämlich gerne eine Binärfile, deswegen klappte das nicht.



  • Heeeyyy, das ist es. Danke dir!



  • Bitte.
    Pass nur noch auf, dass du das Array auch ordnungsgemäß wieder freigibst. 😉


  • Mod

    Nathan schrieb:

    read() hätte nämlich gerne eine Binärfile, deswegen klappte das nicht.

    Das ist dem read egal. Das operiert eine Ebene höher als die binary-Einstellung. Es bekommt dann bloß bei bestimmten Eingangsdaten andere Ausgangsdaten, diese Umwandlung bekommt das read jedoch gar nicht mit.


Anmelden zum Antworten