wav header gibt immer null aus (in c)

Gast #1732034
Lesenswert?
• ▲
▼
Hallo!!! Ich habe da ein Problem mit dem auslesen eines wav headers. Ich 
bekomme da für channelzahl und alles ander auch immer 0 raus. Viellecht 
kann mir ja jemand Helfen. Danke schonmal im voraus.
1
#include <stdio.h>
2
#include <stdlib.h>
3
using namespace std;
4

5
#define DWORD unsigned long
6
#define WORD  unsigned int
7
#define BYTE  unsigned char
8

9

10
struct headerfile
11
  {
12
  char cRIFF[4];            // = "RIFF";        4 Byte
13
      DWORD lP;                 // = 0x00000050;    4 Byte
14
      char  cWaveFmt[8];        // = "WAVEfmt ";    8 Byte
15
      DWORD lUnknown1;          // = 0x00000010;    4 Byte
16
      WORD  wFormatTag;         // = 0x0001;        2 B
17
      WORD  wChannels;          //                  2 B
18
      DWORD lSampleRate;        //                  4 B
19
      DWORD lAvgBytePerSecond;  //                  4 B
20
      WORD  wBlockSize;         //                  2 B
21
      WORD  wBitPerChannel;     //                  2 B
22
      char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!?!?
23
      DWORD lCountOfSamples;    //                  4 B   // und dann ist das Format hier falsch!
24
    };                          // Summe:          44 Byte
25

26

27

28

29

30
int main()
31
    {
32

33
  FILE*sf;
34
  struct headerfile h;
35

36
  /*open the "wav" file*/
37
  sf = fopen("1.wav","rb");
38
  if (sf == NULL)
39
    {
40
    printf("Fehler beim offnen der Datei!!!");
41
    exit(-1);
42
    }
43
  else
44
    {
45
    printf("Geoffnet\n");
46
    }
47

48
  //fseek(sf,0,SEEK_SET);
49

50
  fwrite(&h,sizeof(h),1,sf);
51

52
  printf(" Hier steht: %i",h.wChannels);
53

54

55

56
  fclose(sf);
57

58
  return 0;
59
    }
(Firma: Schweigstill IT) Persönliche Seite #1732062
Lesenswert?
• ▲
▼
Die Annahme, dass es sich bei einem int um einen 16Bit-Wert handelt, 
gilt nicht für alle Plattformen, Compiler usw.. Leider wurde hierzu 
keine Angabe gemacht.

Kommt es auf feste Größen der Datentypen an, sollte man entsprechende 
Typen verwenden, wie sie der Compiler anbietet. Bei GCC o.ä. sind dies 
z.B. uint8_t, uint16_t, uint32_t.

Ebenso darf man sich auch nicht darauf verlassen, dass Strukturen immer 
dicht gepackt sind. Ggf. erfolgt ein Padding, insbesondere dann, wenn 
nachfolgende Elemente eine größere Länge besitzen, so dass sie im 
Speicher fehlausgerichtet wären.

Einigen Prozessoren (x86) macht es nicht aus, auf fehlausgerichtete 
Daten zuzugreifen, wohingegen andere (ARM7/9) damit ganz massive 
Probleme haben und (im besten Fall) eine Exception auslösen oder (im 
schlechteren Fall) ungültige Daten lesen/schreiben.

Einige Compiler besitzen Dekoratoren wie z.B. "packed struct" oder 
Pragmas, mit denen man das Padding unterdrücken kann, aber da sollte man 
schon SEHR genau wissen, was man tut, insbesondere wenn das Programm aus 
mehreren Modulen besteht, die anschließend gelinkt werden.

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.