ifstream größer als gelesen daten



  • Hey Leute ich vertseh gerade nicht was mit meinem ifstream abgeht.
    Ich versuche eine meshdatei zu lese. Diese ist so strukturiert:
    ChunckHeader mit typ ( C_VERTICES,C_INDICES) und die gesamte Größe der folgenden Daten als DWORD.Danach kommt der chunck header abhängig vom typ, also für vertices oder indices.In diesen ist jeweils die anzahl und die größe eines Vertex oder index angegeben.Danach kommen die eigentlichen Vertex/Index Daten

    Jetzt Lese ich eine datei mit solch einem Inhalt, bekomme als erstes die vertices , alles läuft perfekt ab, komme dann jedoch zum dateiende laut dem stream, obwohl die indexdaten noch folgen. Wenn ich die indexdaten in der datei weglasse verhält es sich genau so.
    Die Datei ist auch viel größer als die vertexdaten. Diese beträgt z.B ca 190kb, die Vertexdaten + ChunckHeader sind jedoch nur 120 kb aber trotzdem krieg ich mit tellg -1 raus was zum dateiende hindeutet.

    Warum ist das so ???

    Hier nochmal der Code :

    std::ifstream is("box2.vb");
    	is.seekg(0,std::ios::end);
    	size_t filesize = is.tellg();
    	is.seekg(0, std::ios::beg);
    
    	while(is.read((char*)&h,sizeof(ChunckHeader)))
    	{
    		std::cout << "ChuckSize:" << h.m_chunckSize << std::endl;
    		switch (h.m_type)
    		{
    		case C_VERTICES:
    			is.read((char*)&vertChunck,sizeof(vertChunck));
    			std::cout << "Read vert chunck num:" << vertChunck.m_count << " and total data size:" << h.m_chunckSize + sizeof(ChunckHeader) << std::endl;
    			vertices = new Vertex[vertChunck.m_count];
    			is.read((char*)vertices,vertChunck.m_vertexSize*vertChunck.m_count);
    			//std::cout << vertices[0].Pos.x << " " << vertices[0].Pos.y << " " << vertices[0].Pos.z << std::endl;
    			break;
    		case C_INDICES:
    			std::cout << "Indices!" << std::endl;
    			is.read((char*)&indexChunck,sizeof(indexChunck));
    			std::cout << "Read index chunck num:" << indexChunck.m_count << std::endl;
    			indices = new unsigned long[indexChunck.m_count];
    			is.read((char*)indices,indexChunck.m_indexSize*indexChunck.m_count);
    			std::cout << indices[0] << " " << indices[1] << " " << indices[2] << std::endl;
    			ZeroMemory(&h,sizeof(ChunckHeader));
    			break;
    		default:
    			//skip
    			std::cout << "§skip size:" << h.m_chunckSize << std::endl;
    			break;
    		};
    	}
    


  • Das mit dem

    vertices = new Vertex[vertChunck.m_count];
                is.read((char*)vertices,vertChunck.m_vertexSize*vertChunck.m_count);
    

    kommt mir komisch vor. Lesen tust du vertexSize * count Bytes, aber beim Anlegen des Arrays berücksichtigst du die Größe der Vertices nicht. Wie soll das funktionieren, dass dann trotzdem jedes Vertex in seinem entsprechenden Objekt im Array landet?



  • Das ist eine Binärdatei, richtig? Du öffnest sie gegenwärtig im Textmodus. Schreib mal

    std::ifstream is("box2.vb", std::ios::binary);
    

Log in to reply