我想用 in.wav
文件中的数据填充 hdr
(结构)变量,并且我想复制 in 的前 64 个字节。 wav
文件转换为另一个文件 (out.wav
)。
但是!当第二次使用fread()
时,它开始从第一次使用fread()
时完成的位置复制in.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;
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;
}
怎么了?
最佳答案
这是有意的。 fread
始终从文件的当前读取指针读取并前进同一指针,因此您可以按顺序 block 读取文件,而无需显式查找。
您不必连续读取同一 block 两次。您以这种方式检查的是是否有其他进程同时更改了该文件,如果有,那么您的程序将错误地报告复制失败。
关于c - 为什么第二次使用 fread() 时它不是从头开始而是从第一次 fread() 读取的末尾开始读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400633/