作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个复制 .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/
我是一名优秀的程序员,十分优秀!