2013-05-06 3 views
1

Comment accéder aux données de sous-blocs de fichier .wav? J'ai essayé de copier des données binaires (44 premiers octets) vers une variable struct (taille de 44 octets). Mais il y a un problème: je suis convaincu que j'avais copié les données binaires du fichier input vers une structure nommée hdr. Mais quand j'essaye d'afficher hdr.ChunkID qui contient "RIFF" (tableau de char) il n'imprime pas "RIFF". Il n'imprime rien.Comment accéder aux données des sous-blocs du fichier .wav?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct FMT 
{ 
    char  Subchunk1ID[4]; 
    int   Subchunk1Size; 
    short int AudioFormat; 
    short int NumChannels; 
    int   SampleRate; 
    int   ByteRate; 
    short int BlockAlign; 
    short int BitsPerSample; 

} fmt; 

typedef struct DATA 
{ 
    char  Subchunk2ID[4]; 
    int   Subchunk2Size; 
    int   Data[441000]; // 10 secs of garbage. he-he) 
} data; 

typedef struct header 
{ 
    char  ChunkId[4]; 
    int   ChunkSize; 
    char  Format[4]; 
    fmt   S1; 
    data  S2; 
} Header; 



int main() 
{ 
    FILE *input = fopen("in.wav", "rb"); 
    FILE *output = fopen("out.wav", "wb"); 

    unsigned char buf[64]; 
    Header hdr; 

    if(input == NULL) 
    { 
     printf("Unable to open wave file\n"); 
     exit(EXIT_FAILURE); 
    } 

    fread(&buf, sizeof(char), 64, input); 
    fwrite(&buf, sizeof(char), 64, output); 

    fread(&hdr, sizeof(char), 64, output); 
    printf("\n>>> %s", hdr.ChunkId);   /* Here it is. */ 

    fclose(input); 
    fclose(output); 

    return 0; 
} 

Je ne comprends pas ce qui ne va pas.

+0

Si vous avez besoin de lire 44 octets, pourquoi vous lisez 64? Que ferez-vous avec les 20 octets supplémentaires que vous lisez? –

+0

J'ai un programme qui me montre les 64 premiers octets et les interprète ... par ex. les 4 premiers octets ---> "RIFF" et ainsi de suite. – yulian

+0

Pour le reste des données, vous pouvez vérifier (avec par exemple 'sizeof (Header)') que les structures que vous avez ne sont pas complétées. Si la valeur de 'sizeof' diffère de ce qu'elle devrait être, vous devez dire au compilateur que les structures ne doivent pas être complétées. –

Répondre

1

Parce que vous essayez de lire à partir d'un descripteur de fichier en écriture seule. Lire dans hdr avec le premier appel fread. Pas besoin de tableau buf (ou une deuxième lecture):

Header hdr; 

/* Opening files ... */ 

fread(&hdr, 1, 64, input); 
fwrite(&hdr, 1, 64, output); 

printf("\n>>> %4.4s", hdr.ChunkId); 

/* ... */ 

Notez également que hdr.ChunkID sera pas être terminé comme une chaîne, afin que l'impression en tant que chaîne peut imprimer des caractères apparemment aléatoires après l'en-tête. C'est pourquoi j'ai ajouté la longueur et la précision du champ dans l'appel printf.

+0

Ajoutez qu'il lit/écrit à l'adresse de 'buf' de toute façon, par ex. au lieu de 'fread (& buf, sizeof (char), 64, input);' il devrait être 'fread (buf, sizeof (char), 64, entrée);'. De même, il n'y a aucune garantie que sizeof (Header) est égal à 64. – someguy

+0

@someguy Pour un tableau, 'array' et' & array' retournent tous deux un pointeur vers le premier élément du tableau. –

+0

@someguy Et 'sizeof (hdr)' est _PAS_ 64 octets, ses plus de 44000 octets, donc j'ai changé mon code en lecture seule/écriture de 64 octets. Merci de me le rappeler. –

Questions connexes