CS50 pset4 volume lab解决方案fread函数使用相关疑问咨询
CS50 Volume实验fread/fwrite用法疑问解答
问题1解答
两种写法都是正确的,最终读取的总字节数完全一致:fread的总读取字节数为size * nmemb,fread(header, HEADER_SIZE, 1, input)是按「1个44字节的单元」读取,fread(header,sizeof(uint8_t), HEADER_SIZE, input)是按「44个1字节的单元」读取,最终都会读取44字节的头数据到header数组中。
唯一的区别是fread的返回值:前者读取成功时返回1(成功读取的单元数),后者读取成功时返回44。在这个实验场景下,只要能完整读取头文件,两种写法都可以正常运行,参考代码的写法没有问题。
问题2解答
这是C语言的数组特性决定的:
- 数组名作为参数传递给函数时,会自动退化为指向数组首元素的指针,
header本身就是uint8_t *类型的内存地址,刚好匹配fread/fwrite第一个参数要求的void *类型的内存地址,不需要额外取地址。 buffer是普通的int16_t类型变量,本身存储的是数值不是内存地址,所以需要用&取地址运算符拿到它对应的内存地址,才能传给读写函数使用。
问题3解答
是的,每次循环迭代时buffer的值都会被新读取的数据覆盖。
每次调用fread(&buffer, sizeof(int16_t), 1, input)且读取成功时,函数都会把刚从文件读到的2字节音频采样数据,写入&buffer指向的内存空间,直接覆盖buffer之前存储的旧值。这个逻辑是合理的:每次循环只需要处理当前读取的单个采样,处理完写出去之后,旧值就没有保留的必要了,直接被新采样覆盖即可。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

