c语言 - 无法将一个.wav的开头(前 64 个字节)复制到空



我必须将输入文件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已经是一个指针,在fwriteinput之前不需要&

并且,最重要的是,您不能从一个文件句柄到另一个文件句柄使用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!");
}

相关内容

  • 没有找到相关文章

最新更新