0

我有一个程序应该读取所​​有 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 文件头数据是有序的,但这有时不是真的。

4

1 回答 1

3

我会以二进制模式打开文件,即替换 fopen(fileName, "r")fopen(fileName, "rb")

在某些系统上(您没有告诉您使用的是哪个操作系统,我假设是 Windows?)在文本/非二进制模式下,某些字符在阅读过程中会被替换。

于 2021-10-26T11:41:49.823 回答