Forum: PC-Programmierung wav header gibt immer null aus (in c)


von Fred (Gast)


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
    }

von Nik B. (nikbamert)


Lesenswert?

Unter Umstaenden mal fread() anstatt fwrite() ausprobieren? ;-)

von Karl H. (kbuchegg)


Lesenswert?

Fred schrieb:
> Hallo!!! Ich habe da ein Problem mit dem auslesen eines wav headers.
                                           ********
>
>   fwrite(&h,sizeof(h),1,sf);
    ******

Huch!

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


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.

von HildeK (Gast)


Angehängte Dateien:

Lesenswert?

Da du sowieso irgendwo den von mir erstellten Header gefunden hast, kann 
ich dir gerne auch den Rest zur Verfügung stellen. :-)

Kompiliert mit einem uralten DOS-Compiler liefert das bei mir die 
Informationen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.