Binärdateien einlesen
-
Flachkoepper
- Beiträge: 149
- Registriert: 11. Januar 2005 12:14
- Wohnort: Hannover
Binärdateien einlesen
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
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
Wieso das denn?Flachkoepper hat geschrieben:Jetzt stehe ich vor dem Problem, das mit Qt zu machen. Ich habs versucht mit:
Was spricht gegen deine fread Loesung?
Goos
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Binärdateien einlesen
Wie wäre es mitFlachkoepper hat geschrieben: QDataStream istream( &file2 );
char* ch = new char[1024];
istream.readRawBytes( ch, 1024);
istream.readRawBytes( &struct, sizeof(struct) ); ?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
Flachkoepper
- Beiträge: 149
- Registriert: 11. Januar 2005 12:14
- Wohnort: Hannover
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:
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:
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:
Funktioniert nicht. QDataStream::readRawBytes braucht als ersten Parameter unbedingt ein char*, in das er schreibt.Wie wäre es mit
istream.readRawBytes( &struct, sizeof(struct) ); ?
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.
Wie kommst auf sowas? Da ist gar nix plattformspezifisch.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?
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
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Dann eben istream.readRawBytes( (char*)&struct, sizeof(struct) );Flachkoepper hat geschrieben:Guten Morgen,
@Christian81:Funktioniert nicht. QDataStream::readRawBytes braucht als ersten Parameter unbedingt ein char*, in das er schreibt.Wie wäre es mit
istream.readRawBytes( &struct, sizeof(struct) ); ?
sollte doch nicht so schwer sein.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
Flachkoepper
- Beiträge: 149
- Registriert: 11. Januar 2005 12:14
- Wohnort: Hannover
es lag an der Endianness. Mit:
ist alles wieder in Ordnung.
Danke.
Code: Alles auswählen
in.setByteOrder(QDataStream::LittleEndian);
Danke.
Re: Binärdateien einlesen
Am einfachsten geht es mit QDataStream.
ist auch plattformunabhaengig.
Code: Alles auswählen
QDataStream& >> (QDataStream&,Header&)
QDataStream& << (QDataStream&,const Header&)