Nur weil ich noch nie Binärdateien gelesen habe, bevor ich ein Programm geschrieben habe, das binäre STL-Dateien liest. Ich verwende ifstream
s read member, das einen char * a-Parameter akzeptiert. Um meine Struktur in ein char * umzuwandeln benutze ich einen reinterpret_cast. Aber soweit ich mich an jedes Buch über C ++ erinnere, sagte ich etwas wie "benutze nicht reinterpret_cast, außer du musst". Was wäre eine bessere Möglichkeit, binäre Daten zu lesen, nicht unbedingt direkt, aber schließlich in eine Struktur und ohne reinterpret_cast?
Die Hauptfunktion:
%Vor%Und die Dreiecksstruktur
%Vor%(Zusatzfrage: #pragma pack (1) funktioniert nicht mit cygwins g ++ - 4. Wie kann ich die Größe der Struktur bestimmen?)
Nun, dieser Code sieht gut aus. Sie kümmern sich sogar um das Padding-Problem. Ich sehe nicht, wie du hier vermeiden kannst. Sie können diese Sequenz machen:
%Vor% Aber wirklich, das tue ich nicht in meinem Code. Es ist nur eine lautere Art, eine direkte Reinterpret_cast nach char*
zu machen. (Siehe casting via void * statt reinterpret_cast ).
Die Strukturgröße kann mit sizeof
bestimmt werden. Sie müssen nur das Element static
aus der Klasse innerhalb von .cpp
initialisieren (der Compiler kennt den Wert von ::size
jedoch nicht mehr und kann ihn nicht inline).
Alternativ können Sie es als eine statische Inline-Elementfunktion schreiben. In seinem Body wird der Klassentyp als abgeschlossen betrachtet und sizeof (triangle)
ist erlaubt. Oder Sie können einfach sizeof
verwenden, wie Sie es im Kommentar haben, aber verwenden Sie den Typ und nicht die Mitglieder (bezieht sich auf nicht statische Mitglieder auf diese Weise nur in C ++ 0x):
Der zweite Weg ist jedoch nicht nett, da Sie leicht vergessen können, ihn beim Hinzufügen eines Mitglieds zu aktualisieren.
Zusätzliche Frage: Schauen Sie sich __attribute__((packed))
an.
Die Verwendung von Streams für Datei-E / A (insbesondere binär) ist meiner Meinung nach einfach unangenehm. Ich würde lieber nur die alten C-Funktionen wie fopen und fread verwenden, wenn ich du wäre.
Auch die Speicherzuordnung einer Datei ist eine Technik, der zu wenig Liebe gegeben wird, IMO. Ich kenne keine Standard / portable Bibliotheken, die es unterstützen, aber wenn Sie unter Windows sind, empfehle ich diesen MSDN-Artikel