Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么要在第二次读取文件时使用fread(),而不是从开始读取文件,而是从第1次fread()读取文件的末尾开始?_C_File_Binary Data_Fread - Fatal编程技术网

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时,这个词被大量使用。)