You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言popen调用后fread返回0但read可正常读取是什么原因?

异常原因分析
  • 核心问题是fread的传参语义不符合使用预期:fread的4个入参依次是「存储缓冲区指针」「单个元素的大小」「期望读取的元素个数」「文件流指针」,返回值是成功读取到的完整元素个数。
    你写的fread(buffer, sizeof buffer, 1, fp)是要求读取1个大小为128字节的完整元素,只有实际读到的数据满128字节时才会返回1,否则直接返回0。而echo hello实际仅输出6字节内容(包含末尾自动添加的换行符),无法凑够1个完整的128字节元素,所以直接返回0,看起来就像读取失败。
  • read系统调用的语义和fread不同:它的第三个入参是最大读取字节数,只要有数据就返回实际读取到的字节数,不需要凑够指定长度,所以即使只有6字节也能正常返回结果,符合使用预期。
修复方案

调整fread的参数顺序即可,将原调用改为:

n = fread(buffer, 1, sizeof buffer, fp);

修改后是要求读取最多128个1字节的元素,返回值就是实际读取到的字节数,和read的行为一致,就能正常读到数据了。


内容的提问来源于stack exchange,提问作者timkay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:09:04