2017-04-21 3 views
0

Ich versuche, eine RTCW BSP-Datei mit verschiedenen Klumpen als Strukturen mit ifstream die read() -Funktion definiert, aber ich bekomme die falschen Werte, wenn ich auf die Variablen in der Debugger.Eine Struktur im Binärformat lesen mit ifstream read()

Die ersten 2 structs sind wie folgt definiert:

struct DirEntry 
{ 
    int offset; 
    int length; 
}; 

struct Header 
{ 
    char magic[4]; 
    int version; 
    DirEntry direntries[17]; 
}; 

Der Code, den ich, um zu lesen, ist dies:

Header head; 
mapfile.read((char*)(&head.magic), sizeof(head.magic)); 
mapfile.read((char*)(&head.version), sizeof(head.version)); 

:

bool XWorldMap::Load(string filename, ID3D10Device* pd3d) 
{ 
    ifstream mapfile; 

    mapfile.open(filename.c_str(), ios::binary); 

    if (!mapfile.is_open()) 
     return false; 
    else 
    { 
     // read in header 
     Header head; 
     mapfile.read((char*)(&head), sizeof(head)); 
    } 

    return true; 
} 

ich auch schon versucht, diese habe Immer noch nicht die richtigen Werte.

Ich bin mir ziemlich sicher, es hat mit der Struktur Polsterung in der Datei zu tun, aber ich weiß nicht, wie man es richtig eingestellt ...

Dank.

+0

Können Sie versuchen, nur ein 'Header' zu erstellen, schreiben Sie es in eine Datei, lesen Sie es in eine neue' Header' und prüfen Sie dann, ob es gleich ist oder nicht. A [mcve] sollte helfen, das Problem zu finden. – NathanOliver

+0

Können Sie Ihrer Frage einen hexadezimalen Speicherauszug des ersten Teils der Datei hinzufügen, die Sie laden möchten? – Yojimbo

Antwort

0

Normalerweise, wenn Sie Struktur auf diese Weise lesen möchten, müssen Sie sicherstellen, dass in Ihren Strukturen keine Auffüllung vorhanden ist.

versuchen so etwas wie dies, dass die Compiler, um sicherzustellen, keine zusätzliche Füllbytes um den char-Variable einfügen:

#pragma pack(1) 
struct DirEntry 
{ 
    int offset; 
    int length; 
}; 

struct Header 
{ 
    char magic[4]; 
    int version; 
    DirEntry direntries[17]; 
}; 
#pragma pack() 

Aber da man char [4], ich tun, was nicht Pragma Pack (1) würde das binäre Layout Ihrer Struktur ändern. Können Sie nähere Angaben dazu machen, was bei der Art und Weise, wie Sie Ihre Daten lesen, nicht erwartet wird?

+0

Was kann nicht gepolstert werden? 'write' und' read' sollten alle Bytes in der Klasse schreiben und lesen, einschließlich der auffüllenden, während Sie 'sizeof (Header)' bytes lesen und schreiben. – NathanOliver

+0

Das hat funktioniert! Danke vielmals. – Hermetix

+0

@Hermetix, wenn das verrechnet wird, vergessen Sie nicht, die Antwort zu akzeptieren. – Pavel

Verwandte Themen