struct aus Datei lesen mit C

Gast #1797931
Lesenswert?
• ▲
▼
Hallo zusammen

Ich möchte eine binäre Datei mit einem C-Programm lesen. Die genaue 
Definition des Dateiformats (Offset und Länge der Daten) liegt mir vor*. 
Am Anfang der Datei steht ein Header mit verschiedenen Werten: Strings, 
Int, Float (ähnlich wie z.B. auch der Header einer wav-Datei).

Meine Frage:

Kann ich nun einfach in C eine struct definieren mit den selben 
Datentypen (d.h. gleich lang) in der selben Reihenfolge wie in der Datei 
und dann diese Daten direkt einlesen, d.h. einfach fread aufrufen mit 
einem Zeiger zu dieser struct?

Ich meine, mal gehört zu haben, dass es dem Compiler** überlassen ist, 
wie er die Daten innerhalb einer struct genau anordnet. Dann würde das 
folglich nicht gehen. Ist das so? Lässt sich das irgendwie umgehen (so 
dass also ich definiere wie die Anordnung ist)?

*genau handelt es sich um eine CHARMM DCD-Datei
**Ich verwende gcc 4.1.2 auf x86_64-redhat-linux

Im Voraus Danke für jede Hilfe.
Gast #1798189
Lesenswert?
• ▲
▼
Danke für den Hinweis. Meinst du etwa so:
1
#pragma pack(push)  /* push current alignment to stack */
2
#pragma pack(1)     /* set alignment to 1 byte boundary */
3
 
4
struct MyPackedData
5
{
6
    char Data1;
7
    long Data2;
8
    char Data3;
9
};
10
 
11
#pragma pack(pop)   /* restore original alignment from stack */

(kopiert von: 
http://en.wikipedia.org/wiki/Data_structure_alignment#Default_packing_and_.23pragma_pack)

Endianness ist in Ordnung. Das hab ich abgeklärt.
Gast #1801411
Lesenswert?
• ▲
▼
Rufus t. Firefly schrieb:
> Rolf Magnus schrieb:
>> ... und je nach Prozessor evtl. auch gar nicht geht.
>
> Richtig, aber der Threadstarter wies freundlicherweise darauf hin, daß
> er x86 (mit 64 Bit) nutzt, und da geht das.

Sofern das für immer und ewig die einzige Architektur bleibt, mag das ok 
sein.

Rufus t. Firefly schrieb:
> was je nach Compiler mit #pragma pack oder anderen Mechanismen erzielt
> werden kann.

Da hättest du dir dann konsequenterweise das "je nach Compiler" sparen 
können, schließlich wies er ja freundlicherweise darauf hin, daß er gcc 
4.1.2 benutzt.

Nils S. schrieb:
> Afaik geht das bei gcc aber so:
>
> struct MyPackedData
> {
>     char Data1;
>     long Data2;
>     char Data3;
> } __attribute__((packed));

Ja. Allerdings hat man diese seltsame pragma-Sache vom 
Microsoft-Compiler irgendwann übernommen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.