首页 > 解决方案 > fread() 中的“大小”参数指的是什么?

问题描述

我正在尝试制作一个复制.wav文件头的基本程序,这是我的尝试:

#include <stdio.h>
#include <stdint.h>

int main (void)
{
    FILE* input = fopen("input.wav", "r");
    FILE* output = fopen("output.wav", "w");
    
    uint8_t header [44];
    
    fread(header, sizeof(uint8_t), 44, input);
    fwrite(header, sizeof(uint8_t), 44, output);
    
    fclose(input);
    fclose(output);
}

但是,在未能使其工作之后,我查找了如何做到这一点,显然

fread(header, sizeof(uint8_t), 44, input);
fwrite(header, sizeof(uint8_t), 44, output);

应该

fread(header, 44, 1, input);
fwrite(header, 44, 1, output);

这让我很困惑,因为我认为第二个参数应该是你想要的数据单元类型的大小fread。谁能帮我理解我错过了什么?非常感谢。

标签: cfread

解决方案


sizeof(uint8_t)保证是1 。有些人认为用sizeof表达代替数字是一种很好的风格。

您可以写入 44 个大小为 1 的“块”,也可以写入 1 个大小为 44 的块。在任何一种情况下,您都尝试写入 44 个字节——无论哪种方式,写入部分都是相同的。

不同之处在于返回值,它报告了成功写入的块数。因此,如果您使用该1, 44命令,那么它将准确地告诉您写入了多少字节。如果您使用44, 1订单,那么您将获得01作为返回值(并且无法知道它是否部分成功)。

同样的考虑也适用于fread


部分不正确:这FILE* input = fopen("input.wav", "r");指定以文本模式打开文件,这可能会对输入执行翻译,例如更改行尾。

相反,使用"rb"模式字符串以二进制模式打开。


推荐阅读