-1

hdrファイルからのデータを (構造体) 変数に入力したいのですが、ファイルの最初の 64 バイトを別のファイル ( )in.wavにコピーしたいと考えています。in.wavout.wav

しかし!2回目利用時は1回目利用時終了したところfread()からコピーを開始します。なんで?in.wavfread()

#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;

typedef struct HEADER
{
    char        ChunkID[4];
    int         ChunkSize;
    char        Format[4];
    fmt         S1;
    data        S2;
} header;



int main()
{
    FILE *input = fopen("in.wav", "rb");
    FILE *output = fopen("out.wav", "wb");

    unsigned char buf[64];
    header hdr;

    if(input == NULL)
    {
        printf("Unable to open wave file\n");
        exit(EXIT_FAILURE);
    }

    fread(&hdr, sizeof(char), 64, input);


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


    printf("\n>>> %4.4s", hdr.ChunkID);

    fclose(input);
    fclose(output);

    return 0;
}

何か問題でもありますか?

4

2 に答える 2

5

これは意図されたものです。fread常にファイルの現在の読み取りポインターから読み取り、同じポインターを進めるため、明示的にシークしなくてもファイルを連続したチャンクにすることができます。

同じチャンクを 2 回続けて読み取る必要はありません。この方法でチェックしているのは、その間に他のプロセスがファイルを変更したかどうかです。変更された場合、プログラムはコピーが失敗したと誤って報告します。

于 2013-05-06T14:16:57.963 に答える
2

The file pointer is moved. Read more about it here: Does fread move the file pointer? . You can use fseek or rewind to position at the beginning of a file.

于 2013-05-06T14:17:26.667 に答える