mikrocontroller.net

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


Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define DWORD unsigned long
#define WORD  unsigned int
#define BYTE  unsigned char


struct headerfile
  {
  char cRIFF[4];            // = "RIFF";        4 Byte
      DWORD lP;                 // = 0x00000050;    4 Byte
      char  cWaveFmt[8];        // = "WAVEfmt ";    8 Byte
      DWORD lUnknown1;          // = 0x00000010;    4 Byte
      WORD  wFormatTag;         // = 0x0001;        2 B
      WORD  wChannels;          //                  2 B
      DWORD lSampleRate;        //                  4 B
      DWORD lAvgBytePerSecond;  //                  4 B
      WORD  wBlockSize;         //                  2 B
      WORD  wBitPerChannel;     //                  2 B
      char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!?!?
      DWORD lCountOfSamples;    //                  4 B   // und dann ist das Format hier falsch!
    };                          // Summe:          44 Byte





int main()
    {

  FILE*sf;
  struct headerfile h;

  /*open the "wav" file*/
  sf = fopen("1.wav","rb");
  if (sf == NULL)
    {
    printf("Fehler beim offnen der Datei!!!");
    exit(-1);
    }
  else
    {
    printf("Geoffnet\n");
    }

  //fseek(sf,0,SEEK_SET);

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

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



  fclose(sf);

  return 0;
    }

Autor: Nik Bamert (nikbamert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Umstaenden mal fread() anstatt fwrite() ausprobieren? ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Huch!

Autor: Andreas Schweigstill (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HildeK (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.