Binärdateien einlesen

Alles rund um die Programmierung mit Qt
Antworten
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Binärdateien einlesen

Beitrag 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
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: Binärdateien einlesen

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Binärdateien einlesen

Beitrag 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) ); ?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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. :D

Goos
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag 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
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

es lag an der Endianness. Mit:

Code: Alles auswählen

in.setByteOrder(QDataStream::LittleEndian);
ist alles wieder in Ordnung.

Danke.
Tarek
Beiträge: 46
Registriert: 3. Oktober 2005 14:29
Kontaktdaten:

Beitrag von Tarek »

Direktes Schreiben in ein Struct kann böse ins Auge gehen...
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: Binärdateien einlesen

Beitrag von kitov »

Am einfachsten geht es mit QDataStream.

Code: Alles auswählen

QDataStream& >> (QDataStream&,Header&)
QDataStream& << (QDataStream&,const Header&)
 
ist auch plattformunabhaengig.
Antworten