我必须将输入文件in.wav中的前64字节复制到输出文件out.wav中。(我已经下载了一个程序显示。wav文件的头(块):前44个字节和前20个字节的data_subchunk)
我的代码填充。wav文件与一些值,但(我确信)它是一个垃圾。(程序显示的值不匹配。)
我必须复制in.wav文件的一部分到out.wav:
#include <stdio.h>
#include <stdlib.h>
typedef struct FMT
{
char Subchunk1ID[4];
int Subchunk1Size;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
} fmt;
typedef struct DATA
{
char Subchunk2ID[4];
int Subchunk2Size;
int Data[441000]; // 10 secs of garbage. he-he)
} data;
struct HEADER
{
char ChunkId[4];
int ChunkSize;
char Format[4];
fmt S1;
data S2;
} header;
int main()
{
FILE *input = fopen("in.wav", "r");
FILE *output = fopen("out.wav", "w");
if(input == NULL)
{
printf("Unable to open wave filen");
exit(EXIT_FAILURE);
}
fwrite(&input, sizeof(int), 16, output); // 16'ints' * 4 = 64 bytes
fclose(input);
fclose(output);
return 0;
}
怎么了?
您正在从输入
向打开的输出文件写入数据fwrite(&input, sizeof(int), 16, output);
我不确定,如果你可以使用文件指针这种方式。我将这样做
unsigned char buf[64];
fread(&buf, sizeof(char), 64, input);
fwrite(&buf, sizeof(char), 64, output);
也可以打开二进制模式的文件:fopen("in.wav", "rb")
和fopen("out.wav", "wb")
不能使用FILE
指针作为fwrite
的输入。实际上,在写入缓冲区之前,必须先将数据读入缓冲区。
首先,对fopen
("wb"
而不是"w"
)使用二进制模式。第二,你做了一个不安全的假设,那就是sizeof (int) == 4
,这并不总是正确的。第三,input
已经是一个指针,在fwrite
行input
之前不需要&
。
并且,最重要的是,您不能从一个文件句柄到另一个文件句柄使用fwrite
。您需要在之前复制到char[]
缓冲区,如:
char buffer[40];
if (fread(buffer, sizeof (char), 40, input) != 40) {
printf("Error!");
}
if (fwrite(buffer, sizeof (char), 40, output) != 40) {
printf("Error!");
}