C 为什么要在第二次读取文件时使用fread(),而不是从开始读取文件,而是从第1次fread()读取文件的末尾开始?
我想用C 为什么要在第二次读取文件时使用fread(),而不是从开始读取文件,而是从第1次fread()读取文件的末尾开始?,c,file,binary-data,fread,C,File,Binary Data,Fread,我想用in.wav文件中的数据填充hdr(struct)变量,并将in.wav文件的前64个字节复制到另一个文件(out.wav) 但是!第二次使用fread()时,它会从第一次使用fread()时完成的位置开始在.wav中复制。为什么? #include <stdio.h> #include <stdlib.h> typedef struct FMT { char SubChunk1ID[4]; int SubChunk1
in.wav
文件中的数据填充hdr
(struct)变量,并将in.wav
文件的前64个字节复制到另一个文件(out.wav
)
但是!第二次使用fread()
时,它会从第一次使用fread()
时完成的位置开始在.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;
}
#包括
#包括
类型定义结构FMT
{
char SubChunk1ID[4];
int亚群大小;
短整数音频格式;
短整数通道;
int采样器;
int ByteRate;
短整型块对齐;
短整数位样本;
}fmt;
typedef结构数据
{
char Subchunk2ID[4];
int亚群大小;
int Data[441000];//10秒的垃圾。呵呵)
}数据;
typedef结构头
{
char ChunkID[4];
整数块大小;
字符格式[4];
fmt S1;
数据S2;
}收割台;
int main()
{
文件*input=fopen(“in.wav”、“rb”);
文件*output=fopen(“out.wav”、“wb”);
无符号字符buf[64];
标题hdr;
如果(输入==NULL)
{
printf(“无法打开wave文件\n”);
退出(退出失败);
}
fread(&hdr,sizeof(char),64,输入);
fread(&buf,sizeof(char),64,输入);
fwrite(&buf,sizeof(char),64,输出);
printf(“\n>>>%4.4s”,hdr.ChunkID);
fclose(输入);
fclose(输出);
返回0;
}
怎么了?这是故意的fread
始终从文件的当前读取指针读取并前进该指针,因此您可以按顺序块读取文件,而无需显式查找
您不必连续两次读取同一块。通过这种方式检查的是,是否有其他进程同时更改了文件,如果有,您的程序将错误地报告复制失败。文件指针被移动。请在此处阅读更多信息:。您可以使用fseek或rewind来定位文件的开头。为什么不希望按顺序读取文件?为什么要一次又一次地读取相同的数据?fread
开始从当前文件位置读取数据,并将读取的字节数提前。@sanderedycker第一个用于某些操作(操作),第二个用于验证.wav数据(在我重写它之后)。@Julian:我说的是另一个fread
。在典型使用中,您希望位置自动更新。考虑一下,如果文件大小为16 GB,将会发生什么。你不可能一次读完全部内容,你也不必每次都读fseek()
。(通常,一个人甚至只关心当前文件的位置,更不用说自己跟踪了。)你的文件是一个半特殊的情况,所以你会得到额外的工作PC有效地将文件视为字符流。(您将看到,在涉及标准I/O时,这个词被大量使用。)