我一直在尝试从.Wav文件中读取int类型的数据,但遇到了麻烦。我正在根据这里列出的.wav规范进行操作。我想要从头部读取一个int类型(Subchunk2Size),并将数据存入一个short数组中。无论是使用fread()还是ifstream.read()函数,我都遇到了障碍。我会列出两种读取技术的问题,但其实只需要回答其中一种即可。
我尝试了许多不同的组合来声明subChunk2Size,包括尝试声明指针、数组(单个和多个元素)、声明nullptr以及声明int并传递其引用。 ifstream.read()
sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
FILE * infile = fopen(filename, "rb");
if (infile != NULL)
{
int f = ferror(infile);
int d = fseek(infile, 40, SEEK_SET);
int * subChunk2Size = new int[1];
int i = fread(subChunk2Size, sizeof(int), 1, infile);
int g = ferror(infile);
问题: fread函数无法读取任何内容,i始终初始化为0。我尝试了许多不同的组合来声明subChunk2Size,包括尝试声明指针、数组(单个和多个元素)、声明nullptr以及声明int并传递其引用。 ifstream.read()
sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
ifstream sampleStream(filename,ios::binary);
char * samplesStr;
if (sampleStream.is_open())
{
sampleStream.seekg(40);
char * subChunk2SizeStr = new char[4];
sampleStream.read(subChunk2SizeStr, 4);
int subChunk2Size = 0;
for (int i = 3; i >= 0; i--)
{
subChunk2Size = (subChunk2Size << 8) + subChunk2SizeStr[i];
}
int numBytes = subChunk2Size + *nsamples * 2;
char * samplesStr = new char[numBytes];
sampleStream.read(samplesStr, numBytes);
sampleStream.close();
short * samples = new short[numBytes / 2];
for (int i = 0; i < numBytes / 2; i++)
{
int b = i * 2;
samples[i] = samplesStr[b+1];
samples[i] = (samples[i] << 8) + samplesStr[b];
}
问题: 我的第一个读取和位移操作得出了正确答案约为22,000,但我无法通过第二个循环读取short类型的数据。
感谢任何人对我的问题给予关注。
char
可以是有符号的,并且在转换时会被符号扩展,从而在移位时引起更多麻烦;3. 你似乎没有释放你分配的内存。 - Dietmar Kühl