0

我必须将输入文件 in.wav 中的前 64 个字节复制输出文件out.wav中。(我下载了一个显示.wav 文件头(块)的程序:data_subchunk 的前 44 个字节和前 20 个字节)

我的代码用一些值填充了.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 file\n");
        exit(EXIT_FAILURE);
    }

        fwrite(&input, sizeof(int), 16, output); // 16'ints' * 4 = 64 bytes

    fclose(input);
    fclose(output);

    return 0;
}

怎么了?

4

3 回答 3

3

您正在将数据从输入写入打开的输出文件

fwrite(&input, sizeof(int), 16, output); 

我不确定,如果你能以这种方式使用 FILE 指针。我会这样做

unsigned char buf[64];
fread(&buf, sizeof(char), 64, input);
fwrite(&buf, sizeof(char), 64, output); 

也以二进制模式打开文件:fopen("in.wav", "rb")fopen("out.wav", "wb")

于 2013-05-06T11:47:17.547 回答
3

您不能使用FILE指针作为fwrite. 实际上,您必须先将数据入缓冲区,然后再写入该缓冲区。

于 2013-05-06T11:48:58.283 回答
1

首先,对(而不是) 使用二进制模式。其次,您做出了一个不安全的假设,即,这并不总是正确的。第三,已经是指针了,不需要befor就行了。fopen"wb""w"sizeof (int) == 4input&inputfwrite

而且,最重要的是,您不能使用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!");
}
于 2013-05-06T11:47:28.200 回答