Seite 1 von 1
Binärdateien einlesen
Verfasst: 1. April 2005 14:55
von Flachkoepper
Hallo,
ich habe eine Binärdatei, die ich einlesen möchte. Die ersten 1024 Byte bestehen aus einem Headerfile, welches folgendes Format hat:
struct Header {
char DateiName[15];
char Ort[20];
char Datum[10];
usw.
};
Nach dem einlesen möchte ich mit header.DateiName, header.Ort usw. die einzelnen Elemente ansprechen können.
Mit C geht das recht einfach:
struct Header header;
fread(&header, sizeof(Header), 1, f1);
Jetzt stehe ich vor dem Problem, das mit Qt zu machen. Ich habs versucht mit:
QDataStream istream( &file2 );
char* ch = new char[1024];
istream.readRawBytes( ch, 1024);
Klappt auch, Problem hierbei ist nur, das ich jetzt ein einziges char-Array habe und nicht mehr meine schöne struct. Hat irgendwer ne Ahnung, wie ich das elegant lösen kann?
Viele Grüße,
Flachkoepper
Re: Binärdateien einlesen
Verfasst: 1. April 2005 18:17
von Goos
Flachkoepper hat geschrieben:Jetzt stehe ich vor dem Problem, das mit Qt zu machen. Ich habs versucht mit:
Wieso das denn?
Was spricht gegen deine fread Loesung?
Goos
Re: Binärdateien einlesen
Verfasst: 1. April 2005 19:26
von Christian81
Flachkoepper hat geschrieben:
QDataStream istream( &file2 );
char* ch = new char[1024];
istream.readRawBytes( ch, 1024);
Wie wäre es mit
istream.readRawBytes( &struct, sizeof(struct) ); ?
Verfasst: 4. April 2005 09:43
von Flachkoepper
Guten Morgen,
@Goos:
Gerade wegen der Plattformunabhängigkeit möchte ich das jetzt mit Qt machen. Und wenn ich mir fread angucke, so ist gerade der FILE* hochgradig plattformspezifisch, oder?
@Christian81:
Wie wäre es mit
istream.readRawBytes( &struct, sizeof(struct) ); ?
Funktioniert nicht. QDataStream::readRawBytes braucht als ersten Parameter unbedingt ein char*, in das er schreibt.
Was ich mir vielleicht noch überlegt habe, ist, das char-Array danach in die struct zu kopieren. Habe aber aufgrund mangelnder Erfahrung leider keine Ahnung, ob das klappt, und wenn ja, wie.
Verfasst: 4. April 2005 09:58
von Goos
Flachkoepper hat geschrieben:@Goos:
Gerade wegen der Plattformunabhängigkeit möchte ich das jetzt mit Qt machen. Und wenn ich mir fread angucke, so ist gerade der FILE* hochgradig plattformspezifisch, oder?
Wie kommst auf sowas? Da ist gar nix plattformspezifisch.
fopen und fread, die du fuer dein Unterfangen brauchst sind ANSI-C und koennen von daher gerne benutzt werden. Da brauchst dir also wirklich nix neues in QT suchen.
Goos
Verfasst: 4. April 2005 11:19
von Christian81
Flachkoepper hat geschrieben:Guten Morgen,
@Christian81:
Wie wäre es mit
istream.readRawBytes( &struct, sizeof(struct) ); ?
Funktioniert nicht. QDataStream::readRawBytes braucht als ersten Parameter unbedingt ein char*, in das er schreibt.
Dann eben istream.readRawBytes( (char*)&struct, sizeof(struct) );
sollte doch nicht so schwer sein.
Verfasst: 4. April 2005 11:34
von Flachkoepper
Tja, und dabei war ich mir 100%-ig sicher, dass ich das schon ausprobiert habe und es nicht geklappt hat. Nun ja, jetzt funktioniert alles (sogar in beiden Varianten).
Vielen Dank euch beiden!
Bis demnächst (denke ich mal),
Flachkoepper
Verfasst: 23. Januar 2007 17:36
von darmstadt
es lag an der Endianness. Mit:
ist alles wieder in Ordnung.
Danke.
Verfasst: 23. Januar 2007 18:17
von Tarek
Direktes Schreiben in ein Struct kann böse ins Auge gehen...
Re: Binärdateien einlesen
Verfasst: 24. Januar 2007 08:49
von kitov
Am einfachsten geht es mit QDataStream.
Code: Alles auswählen
QDataStream& >> (QDataStream&,Header&)
QDataStream& << (QDataStream&,const Header&)
ist auch plattformunabhaengig.