【发布时间】:2013-05-06 14:13:08
【问题描述】:
我想用来自in.wav 文件的数据填充hdr (struct) 变量,并且我想将in.wav 文件的前64 个字节复制到另一个文件(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从当前文件位置开始读取并将其增加读取的字节数。 -
@SanderDeDycker 第一个用于某些操作(用于操作),第二个用于验证 out.wav 数据(在我重写之后)。
-
@Julian:我说的是另一个
fread。在典型使用中,您希望自动更新位置。考虑一下如果该文件大小为 16 GB 会发生什么。你不能一次读完整本书,你也不想每次都去fseek()。 (通常,只有远程甚至关心当前文件位置,更不用说自己跟踪它了。)你是一个半特殊情况,所以你得到额外的工作。 :P -
C 有效地将文件视为字符流。 (你会看到这个词在标准 I/O 方面被大量使用。)
标签: c file binary-data fread