C++ 读取波头c++;
因此,我试图读取一个wav文件的头,由于某种原因,我只能读取它的一部分 Im使用此结构存储数据:C++ 读取波头c++;,c++,wav,C++,Wav,因此,我试图读取一个wav文件的头,由于某种原因,我只能读取它的一部分 Im使用此结构存储数据: struct WaveHeaderType { char chunkId[4]; unsigned long chunkSize; char format[4]; char subChunkId[4]; unsigned long subChunkSize; unsigned short audioFormat; unsigned short
struct WaveHeaderType
{
char chunkId[4];
unsigned long chunkSize;
char format[4];
char subChunkId[4];
unsigned long subChunkSize;
unsigned short audioFormat;
unsigned short numChannels;
unsigned long sampleRate;
unsigned long bytesPerSecond;
unsigned short blockAlign;
unsigned short bitsPerSample;
char dataChunkId[4];
unsigned long dataSize;
};
下面是读取文件的代码:
WaveHeaderType waveFileHeader;
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
在此之后,只有chunkId、chunkSize、format和subChunkId有值,其余的都是null。我做错了什么?或者我只是碰巧有一个损坏的wav文件?(我可以在kmplayer中播放wav文件,没有问题)
这可能就是你的意思。With&将是指针的大小,因此您只读取4或8个字节
也可以考虑在结构上使用某种类型的语法包,除非你从一个正式的标题中看到,在成员之间打交道会导致与文件不同的布局。
这可能就是你的意思。With&将是指针的大小,因此您只读取4或8个字节也考虑在结构上使用某种类型的语法包,除非您从一个正式的头文件中得到,否则成员之间可能会有一个与文件不同的布局。
< P>而不是<代码> siZeof(& WaveFieleHead)< /Cord>您需要编写<代码> siZeof(WaveFielHead)< /Calp>sizeof(&waveileheader)
在32位系统中提供恒定的4字节(指针大小)
sizeof(waveileheader)
给出了waveileheader
struct的字节大小,而不是sizeof(&waveileheader)
您需要编写sizeof(waveileheader)
sizeof(&waveileheader)
在32位系统中提供恒定的4字节(指针大小)
sizeof(waveileheader)
给出了waveileheader
struct的字节大小,您要读取的结构大小是sizeof(waveileheader)
使用&
可以读取指向waveFileHeader的元素的大小
尝试:
您想读取结构的大小,即
sizeof(waveFileHeader)
使用&
可以读取指向waveFileHeader的元素的大小
尝试:
除了上面提到的“指针的大小与结构的大小不同”之外,当我看到数据结构中的
无符号long
应该存储在文件中(或从文件中读取)时,我非常担心。这正是将代码从32位环境移动到64位环境(或从一个编译器移动到另一个编译器,或使用相同的编译器,但在不同的处理器类型上)时出错的类型
您应该使用大小定义的类型,例如
uint8\u t
,uint16\u t
,uint32\u t
,等等。除了上面提到的“指针的大小与结构的大小不一样”之外,当我在应该存储在文件中的数据结构中看到无符号long
时,我非常担心(或从文件中读取)。这正是将代码从32位环境移动到64位环境(或从一个编译器移动到另一个编译器,或使用相同的编译器,但在不同的处理器类型上)时出错的类型
您应该使用大小定义的类型,例如
uint8\u t
,uint16\u t
,uint32\u t
,等等。使用固定结构(如您正在做的)可以用于许多WAV文件,但文件头中可能有其他元素,并且某些字段的大小可能不同使用mmioOpen进行rting,您可以使用它来解析文件,如下所示:
使用您正在使用的固定结构可以用于许多WAV文件,但文件头中可能有其他元素,某些字段的大小可能不同。有一系列API函数,以mmiopen开头,您可以使用它们来解析文件,如图所示:
我不知道它是怎么来的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图弄乱它,但这确实是错误的方向)我不知道它是怎么来的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图弄乱一点,但这确实是错误的方向)我不知道它是如何到达那里的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图弄乱一点,但这确实是错误的方向)我不知道它是怎么来的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图把它弄糟一点,但那确实是错误的方向)我不知道它是怎么来的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图弄乱一点,但这确实是错误的方向)我不知道它是如何到达那里的,不应该是指针。但这根本解决不了问题。(指针来自一个早期版本,我试图弄乱一点,但这确实是错误的方向)你用二进制模式打开了文件,是吗?你用二进制模式打开了文件,是吗?
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);