c - 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
。谁能帮我理解我错过了什么?非常感谢。
解决方案
sizeof(uint8_t)
保证是1
。有些人认为用sizeof
表达代替数字是一种很好的风格。
您可以写入 44 个大小为 1 的“块”,也可以写入 1 个大小为 44 的块。在任何一种情况下,您都尝试写入 44 个字节——无论哪种方式,写入部分都是相同的。
不同之处在于返回值,它报告了成功写入的块数。因此,如果您使用该1, 44
命令,那么它将准确地告诉您写入了多少字节。如果您使用44, 1
订单,那么您将获得0
或1
作为返回值(并且无法知道它是否部分成功)。
同样的考虑也适用于fread
。
部分不正确:这FILE* input = fopen("input.wav", "r");
指定以文本模式打开文件,这可能会对输入执行翻译,例如更改行尾。
相反,使用"rb"
模式字符串以二进制模式打开。
推荐阅读
- ios - 格式化后从文本字段中获取双倍值
- mysql - MySQL - 在一条语句中从查询中更新表字段
- ios - UIViewController 中有两个视图,中间有一个 sizer - iPad
- swift - Swizzling导致递归
- javascript - 将 javascript 语法从 ids 更改为 classes
- python - 如何在python中的字典中有两个键和一个值
- javascript - 有条件地显示 3 个组件中的一个
- aws-lambda - AWS Lambda Go:VM 在挂载文件夹时出错,/var/task/main 没有这样的文件或目录。如何解决?
- postgresql - Postgresql:通过触发器检查表中是否存在值
- c - C 使用结构的动态内存分配