ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C 语言文件 IO:系统 IO 与标准 IO 返回值致命区别

2026/8/24 14:36:06 拓冰建站 浏览量
C 语言文件 IO:系统 IO 与标准 IO 返回值致命区别 前言绝大多数 C 语言初学者都会踩一个超级大坑先学系统 IO read/write记住了「读写返回值是字节数」然后惯性带入到标准 IO fread/fwrite导致读取逻辑完全写错、读不到数据、判断条件失效、程序BUG满天飞。实际上系统IO 和 标准IO 的返回值逻辑完全不是一套东西。本文彻底归纳、一次性讲透二者核心区别适合永久收藏、复习、发表学习笔记。一、两套 IO 体系根本区别1. 系统 IOread / write属于Linux 系统调用内核原生接口无用户缓冲区直接操作内核使用文件描述符 fdint 数字返回值字节数2. 标准 IOfread / fwrite属于C 标准库跨平台通用自带用户缓冲区效率更高使用文件指针 FILE*返回值完整数据块个数重点不是字节二、系统 read / write 原理按字节函数原型ssize_t read(int fd, void *buf, size_t count);核心规则第三个参数想要读取多少字节返回值实际读到的字节数返回值含义ret 0读到对应字节ret 0文件结束EOFret -1读取出错总结read 一切以「字节」为单位。三、标准 fread / fwrite 原理按块函数原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);参数真正含义90%初学者不懂size一块数据的大小如结构体大小nmemb想要读取多少块返回值致命重点fread 返回的是成功读到多少个完整块不是字节数不是字节数不是字节数返回值含义ret nmemb读取完全成功ret nmemb文件读完 / 出错永远不会返回负数四、最经典对比场景彻底看懂差距假设一个结构体大小8字节文件仅剩5字节。1. read 读取 8 字节返回5→ 读到 5 字节数据2. fread 读取 1 块8字节返回0→ 不够一整块判定读取失败五、数据类型隐藏坑考试、工作高频错1. ssize_t系统IO有符号整数 →可以存 -1能判断错误。2. size_t标准IO无符号整数 →永远大于等于0所以 fread 绝对不能写if(ret 0)永久不成立六、终极一句话总结系统IO read/write按字节读写返回字节数出错 -1标准IO fread/fwrite按整块读写返回块数无负数最大误区把 read 的字节思维带到 fread 里程序直接报废。七、延伸二进制文件读写核心常识针对结构体二进制读写额外总结你之前疑惑的点fwrite 不会自动换行二进制文件没有“行”的概念数据靠结构体固定大小区分不靠换行符txt 后缀只是名字不影响二进制读写逻辑