2016-07-14 87 views
0

我正在读取一个二进制wav文件,将其放入一个缓冲区,并且我想再次写入完全相同的wav文件。C - 将缓冲区写入二进制文件(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),1048,file3);替代fwrite(buffer3,sizeof(buffer3),1,file3);(比如说1048),我可以得到一些可播放的东西,但不是带有循环的整个wav。

谁能告诉我有什么问题吗?也许这是for循环的长度是错误的,也许我不应该把fileLen作为一个限制吗?我应该用什么来取代1?

在此先感谢

+2

'sizeof(buffer3)' - 没有做你认为的事情;这是*指针*的大小。无论如何,我不确定你想在循环中使用'fwrite'。 – WhozCraig

+0

你是对的我用sizeof(char)代替它,但仍然是相同的(因为我的缓冲区指向字符) –

回答

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 
+0

我现在明白了。非常感谢你 –

0

我通过把fwrite(buffer3,sizeof(char),78000,file3);外面的for循环,以78000作为文件1的大小,解决它。但我的问题是,我怎么知道代码的大小是多少?

+0

大小是'fileLen'。 – pmg

1

请注意以下事项:

  • 的事实,该文件是“原始”,并有一个“.WAV”扩展名,如你所说的那样,既没有意味着它是一个wav文件,也不让一个wav档案出来了。为了成为一个wav文件,它需要一个有效的WAV头,并且需要适当的音频文件API来读取和写入。你正在阅读和复制的内容是无标头未知格式和未知字节顺序的数据。
  • 如果您希望使用标准库C函数将内容从一个文件复制到另一个文件,您可以在字节级别执行此操作,而不需要解释内容,这就是您的操作。

在这种情况下,有在你的代码的几个问题:

  1. 缓冲区的冗余填充和铸件的malloc在C回报:
    buffer = malloc(fileLen);应该工作。
  2. 模棱两可的逻辑:为什么在一次读取源文件后,在循环内复制缓冲区并写入目标文件字节 - 每字节?
  3. 即使如此,您仍然将不正确的参数传递到freadfwrite函数,请检查页。
    fread(buffer, 1, fileLen, file);应该修复读取。 (1等于sizeof (char))。
  4. 为什么你需要一个冗余缓冲区buffer3如果你不解释文件的内容?
  5. 即使如此,您仍然将不正确的参数传递给循环内的函数。这应该做的修补程序:

    for (int i=0; i<fileLen; i++){ 
        buffer3[i]=buffer[i]; 
        fwrite(&(buffer3[i]),1,1,file3); 
    } 
    

一般人不知道该文件的事先大小,打开源文件之前。因此,分配合理大小的缓冲区,然后以由缓冲区大小确定的区块读取和写入。在这种情况下,你的读程序也应该处理缓冲区下溢情况。