C++ C++;-从另一个Wave文件创建一个Wave(.Wav)文件,但带有自定义头

C++ C++;-从另一个Wave文件创建一个Wave(.Wav)文件,但带有自定义头,c++,fopen,fwrite,wav,C++,Fopen,Fwrite,Wav,我对编程非常陌生,所以你们的任何帮助都会非常有帮助,我将非常感激。这是C++的方式。我有一个wave文件,我成功地读取了它的头文件。我想创建另一个wave文件,该文件将第一个wave文件的其他数据值作为输出。每个值将是第一个文件中两个值的平均值 这将使样本数量减少一半。为了以正确的速度播放,我需要更改第二个wave文件的头信息,以便采样频率减半。然而,当我试图使用fwrite时,我似乎无法进行算术运算。我已经成功地编写了第二个wave文件,它的头与第一个文件的头相同,但是我需要更改一些值 我真的

我对编程非常陌生,所以你们的任何帮助都会非常有帮助,我将非常感激。这是C++的方式。我有一个wave文件,我成功地读取了它的头文件。我想创建另一个wave文件,该文件将第一个wave文件的其他数据值作为输出。每个值将是第一个文件中两个值的平均值

这将使样本数量减少一半。为了以正确的速度播放,我需要更改第二个wave文件的头信息,以便采样频率减半。然而,当我试图使用fwrite时,我似乎无法进行算术运算。我已经成功地编写了第二个wave文件,它的头与第一个文件的头相同,但是我需要更改一些值

我真的认为这只是一个简单的数据类型出错或其他什么,但我是一个新手程序员,所以我无法理解它

FILE* fptr2;                        // File pointer for WAV output
fptr2 = fopen("KingdomOut.wav","w");    // Open wav file for reading


int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;

cout << ChunkSizeOut << endl;

// RIFF chunk descriptor
fwrite(HeaderInfo.ChunkID, sizeof(char), 4, fptr2);             // "RIFF"
fwrite(&HeaderInfo.ChunkSize, sizeof(int), 1, fptr2);           // 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
fwrite(HeaderInfo.Format, sizeof(char), 4, fptr2);              // "WAVE"
// fmt sub-chunk
fwrite(HeaderInfo.Subchunk1ID, sizeof(char), 4, fptr2);         // "fmt "
fwrite(&HeaderInfo.Subchunk1Size, sizeof(int), 1, fptr2);       // bytes remaining in subchunk, 16 if uncompressed
fwrite(&HeaderInfo.AudioFormat, sizeof(short), 1, fptr2);       // 1 = uncompressed
fwrite(&HeaderInfo.NumChannels, sizeof(short), 1, fptr2);       // mono or stereo
fwrite(&HeaderInfo.SampleRate, sizeof(int), 1, fptr2);
fwrite(&HeaderInfo.ByteRate, sizeof(int), 1, fptr2);            // == SampleRate * NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BlockAlign, sizeof(short), 1, fptr2);        // == NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BitsPerSample, sizeof(short), 1, fptr2);         
// data sub-chunk
fwrite(HeaderInfo.Subchunk2ID, sizeof(char), 4, fptr2);         // "data"
fwrite(&HeaderInfo.Subchunk2Size, sizeof(int), 1, fptr2);       // == NumSamples * NumChannels * BitsPerSample/8

fclose(fptr2);
文件*fptr2;//WAV输出的文件指针
fptr2=fopen(“KingdomOut.wav”,“w”);//打开wav文件进行读取
int ChunkSizeOut=(HeaderInfo.ChunkSize)/2+18;

无法阅读关于
fopen
呼叫的信息。编写二进制文件时,需要将a
'b'
添加到打开模式,如

fptr2 = fopen("KingdomOut.wav","wb");    // Open wav file for reading

没有
'b'
的默认情况是以文本模式打开文件,这可能会导致某些字节的写入方式不同(更具体地说,值
0x0a
可能被写入序列
0x0d
0x0a
,即换行
'\n'
可能被转换为换行回车
“\r\n”
)。

HeaderInfo看起来像一个结构,ChunkSize字段的类型是什么?尝试在声明此结构的头文件(*.h可能是riff.h或wave.h,我现在不知道您使用的是哪种库)中查找声明。根据您的代码HeaderInfo.ChunkSize,任何方式都应该是一个int值。所以你可以试试这样的东西:

int ChunkSizeOut = ((int)HeaderInfo.ChunkSize)/2 + 18;
而不是:

int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;

如果你在C++编程,你应该学会使用。你绝对正确,我的代码更像C我想,但我被推荐使用Frand写这个,所以这就是我所使用的。谢谢你,我添加了B,它改变了一些值,但是它仍然是不正确的。我还在做这个。是的,主要是这样。经过几次修改后,它现在开始工作了。在读取文件之后添加b是导致这种情况发生的原因。谢谢Chunksize是一个int。我正在使用stdafx.h和Windows.h(VisualStudio2010)。我试过你的建议,但没有改变结果。谢谢你的回复。我创建了struct HeaderInfo并从第一个wave文件中读取了中的值
fwrite(&ChunkSizeOut,sizeof(int),1,fptr2)
;它是否在新的wave文件中写入值
ChunkSizeOut
(与您在控制台中写入的值相同)我发誓我经常刷新此页面,但它说您的评论是4小时前的,对不起。不管怎样,不,我试着这么做,但所有的价值观都搞砸了。它甚至没有输出我写的东西。每次程序运行时它都会改变。是的,你说的确实有效。哈哈,我的二读文件不是“rb”而是“r”,所以所有的数字都错了。