我正在读取一个wav文件作为二进制文件,将它放在缓冲区中,我想再次编写完全相同的wav文件。
到目前为止,这是我的代码:
file = fopen("tone1.wav", "rb");
file3 = fopen("outout.wav","wb");
fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);
buffer=(char *)malloc(fileLen+1);
buffer3=(char *)malloc(fileLen+1);
fread(buffer, fileLen, 1, file);
for (int i=0;i<fileLen+1;++i){
buffer3[i]=buffer[i];
fwrite(buffer3,sizeof(buffer3),1,file3);
}
fclose(file);
fclose(file3);
free(buffer);
free(buffer3);
问题是outout wav文件是空的并且无法播放。
我不确定我做错了什么。如果我将fwrite(buffer3,sizeof(buffer3),1,file3);
替换为fwrite(buffer3,sizeof(buffer3),1048,file3);
(让我们说1048),我会得到一些可玩的东西但不是整个wav中有一个循环。
谁能告诉我这是什么问题?也许这是for循环长度错了也许我不应该把fileLen作为限制呢?我该怎样替换1?
提前致谢
答案 0 :(得分:1)
请注意以下事项:
wav
文件,也不会生成一个wav
文件。为了成为wav
文件,它需要一个有效的WAV标头,并且需要适当的音频文件API来进行读写。您正在阅读和复制的内容是未知格式和未知字节序的无头数据。在这种情况下,您的代码中几乎没有问题:
malloc
的返回值
buffer = malloc(fileLen);
应该有用。fread
和fwrite
函数传递错误的参数,请检查 man 页面。 fread(buffer, 1, fileLen, file);
应该修复阅读。 (1
等于sizeof (char)
)。buffer3
?即使如此,您仍然会在循环内向函数传递不正确的参数。这应该做的修复:
for (int i=0; i<fileLen; i++){
buffer3[i]=buffer[i];
fwrite(&(buffer3[i]),1,1,file3);
}
在打开源文件之前,通常不会事先知道文件的大小。因此,一个分配合理大小的缓冲区,然后读取和写入由缓冲区大小决定的块。在这种情况下,您的读取例程也应该处理缓冲区下溢情况。
答案 1 :(得分:0)
不要在循环内写字。
或者每次都写不同的字符(并不总是buffer3[0]
)。
fread(buffer, fileLen, 1, file);
for (int i = 0; i < fileLen; ++i) {
// transform and copy
buffer3[i] = transform(buffer[i]);
//fwrite(buffer3 + i, 1, 1, file3); // write 1 character only
}
fwrite(buffer3, fileLen, 1, file3); // write all the new buffer
答案 2 :(得分:0)
我通过将fwrite(buffer3,sizeof(char),78000,file3);
置于for循环之外来解决它,其中78000是file1的大小。但我的问题是,我如何通过代码知道它的大小是什么?