c - 为什么第二次使用 fread() 时它不是从头开始而是从第一次 fread() 读取的末尾开始读取文件?

标签 c file binary-data fread

我想用 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/

相关文章:

Python:以二进制模式读取文件不返回预期值

c - 没有定义类型的函数参数默认为int?我疯了吗?

c# - 读取字节数组中的多个文件

c# - 从 dotnet 程序集检索资源

android - 如何将来自服务器的 base64 json 文件保存在移动外部存储中?

c# - 在 C# 中从 IntelHex 创建二进制文件

c - 使用 C 函数搜索标签 (TLV)

c - c语言中的%d和%*d有什么区别?

c - Python C API 段错误

java - 是否有任何用于二进制文件解析的 Java 框架?