gpt4 book ai didi

c - fread() 中的 "size"参数指的是什么?

转载 作者:行者123 更新时间:2023-12-04 00:51:28 26 4
gpt4 key购买 nike

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

#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 的数据单元类型的大小。谁能帮助我了解我所缺少的?非常感谢。

最佳答案

第一个大小参数指定单个记录的大小。第二个大小参数定义要加载的记录数。 fread 返回它加载的记录数。

因此,如果您有一个 20 字节的结构,并且您有一个文件,其中存储了 5 条记录,那么您可以像这样传递它。

if(fread(ptr, 20, 5, strm) != 5)
printf("Unable to load 5 records\n");

或者,您可以像这样加载相同的文件:

if(fread(ptr, 1, 5*20, strm) != 5*20)
printf("Unable to load 5 records\n");

效果是一样的,但是第一个版本的可读性更好,因为通常你可能会读取记录而不仅仅是“字节”。在应用程序逻辑的上下文中更容易理解。当然,您不必自己计算字节数,从而减少出错的机会。

这同样适用于fwrite

所以在你上面的例子中我宁愿这样写:

  // Your header is 44 bytes long (which is sizeof) but you want to read ONE header
if(fread(header, sizeof(header), 1, input) != 1)
... error reading 1 header ....

关于c - fread() 中的 "size"参数指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66135727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com