Wie's der Zufall will, habe ich die letzten zwei Tage an einer Stream-Implementierung zum einlesen von MD3-Dateien gearbeitet.
Ich bin wie folgt vorgegangen:
- Alle Strukturen mit Klassen implementiert um C++ "treu" zu bleiben.
- Zu jeder Klasse (deren Elemente alle protected sind) den >>-Operator als friend überladen.
- Wenn man eine komplette MD3-Datei einlesen will muss man somit nur noch folgenden Code schreiben:
MD3 md3;
ifstream File("C:\\Blabla.md3", ios_base::binary);
File >> md3;
File.close();
Natürlich kann man auch die einzelnen Strukturen mit dem >>-Operator einlesen, wenn man mag.
Ein Beispiel:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class MD3_Frame
{
friend ifstream & operator>>(ifstream &, MD3_Frame &);
public:
MD3_Frame();
protected:
float Bounds[6];
float Origin[3];
float Radius;
char Name[16];
};
MD3_Frame::MD3_Frame()
{
for(int n = 0; n < 6; n++)
Bounds[n] = 0.0f;
for(n = 0; n < 3; n++)
Origin[n] = 0.0f;
Radius = 0.0f;
Name[0] = '\0';
}
ifstream & operator>>(ifstream &i, MD3_Frame &Frame)
{
i.read(reinterpret_cast<char *>(&Frame.Bounds), sizeof(float) * 6);
i.read(reinterpret_cast<char *>(&Frame.Origin), sizeof(float) * 3);
i.read(reinterpret_cast<char *>(&Frame.Radius), sizeof(float));
i.read(reinterpret_cast<char *>(&Frame.Name), sizeof(char) * 16);
return i;
}
|