如何访问 .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;
}
无法理解有什么问题。
答案 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
调用中添加字段长度和精度的原因。