如何访问.wav文件的子块数据?

时间:2013-05-06 13:12:24

标签: c file struct binary-data

如何访问 .wav 文件的子块数据? 我一直在尝试将二进制数据(前44个字节)复制到结构变量(大小为44个字节)。但是有一个问题:我确信我已经将文件input中的二进制数据复制到名为hdr的结构中。

但是当我试图显示包含“RIFF”(char数组)的hdr.ChunkID时,它不会打印“RIFF”..它什么都不打印。

#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;
}

无法理解有什么问题。

1 个答案:

答案 0 :(得分:1)

因为您尝试从只写文件句柄中读取。通过第一次hdr来电阅读fread。不需要buf数组(或第二次读取):

Header hdr;

/* Opening files ... */

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

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

/* ... */

另请注意,hdr.ChunkID作为字符串终止,因此将其打印为字符串可能会在标题后打印看似随机的字符。这就是我在printf调用中添加字段长度和精度的原因。