我有一个程序应该读取所有 wav 文件的元数据。我使用了以下解析的 struct 和 fread 函数。
这段代码遇到的问题是,对于一些 .wav RIFF 标头 fmt 文件,即使在解析如下所示的结构之后,读取的元数据也不正确,如果我在每个读取函数之间使用 fseek 函数会有所帮助。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
using std::string;
typedef struct RIFF_CHUNCK_DISCRIPTOR {
char RIFF[4]; // RIFF Header Magic header
unsigned long ChunkSize; // RIFF Chunk Size
char WAVE[4]; // WAVE Header
};
typedef struct FMT_CHUNCK_DISCRIPTOR {
char fmt[4]; // FMT header
unsigned long Subchunk1Size; // Size of the fmt chunk
unsigned short AudioFormat; // Audio format
unsigned short NumOfChan; // Number of channels
unsigned long SamplesPerSec; // Sampling Frequency in Hz
unsigned long bytesPerSec; // bytes per second
unsigned short blockAlign; // 2=16-bit mono, 4=16-bit stereo
unsigned short bitsPerSample; // Number of bits per sample
};
typedef struct DATA_SUB_CHUNCK {
char Subchunk2ID[4]; // "data" string
unsigned long Subchunk2Size; // Sampled data length
};
int main(int argc, char* argv[]) {
const char* fileName;
cout << "enter f name " << fileName;
RIFF_CHUNCK_DISCRIPTOR RCD;
FMT_CHUNCK_DISCRIPTOR FCD;
DATA_SUB_CHUNCK DSC;
FILE* InFile = fopen(fileName, "r");
fread(&RCD, 1, sizeof(RIFF_CHUNCK_DISCRIPTOR), InFile);
fread(&FCD, 1, sizeof(FMT_CHUNCK_DISCRIPTOR), InFile);
fread(&DSC, 1, sizeof(DATA_SUB_CHUNCK), InFile);
}
我使用多个结构的原因是为了确保正确读取头文件的所有数据,因为尽管大多数 wav 文件头数据是有序的,但这有时不是真的。