吃透标准 IO:缓冲区、读写流程避坑完整总结

发布时间:2026/10/23 9:57:23

吃透标准 IO:缓冲区、读写流程避坑完整总结 标准IO总结标准IO是标准C库提供的库函数头文件stdio.h操作对象为文件流指针FILE*。底层会调用文件IO系统调用自带用户层缓冲区可移植性强。一、系统预定义3个文件流流指针含义对应硬件文件IO等价fdstdin标准输入流键盘0stdout标准输出流显示屏1stderr标准出错流显示屏2二、缓冲区分类行缓冲默认1K用于终端设备刷新条件遇到\n、程序结束、fflush()强制刷新、缓冲区满。全缓冲默认4K用于普通文件刷新条件程序结束、文件关闭、缓冲区写满、fflush()强制刷新。无缓冲stderr数据直接输出不缓冲。三、核心API1. fopen 打开文件FILE *fopen(const char *pathname, const char *mode);功能打开文件将文件关联到文件流。参数pathname文件名/路径字符串形式。mode打开模式字符串r只读文件必须存在r读写文件必须存在w只写不存在创建存在清空文件w读写不存在创建存在清空文件a只写追加不存在创建写总是在文件末尾a读写追加读从文件开头写永远在文件末尾返回成功返回FILE*失败返回NULL。2. fclose 关闭文件int fclose(FILE *stream);参数文件流指针。返回成功0失败EOF(-1)。注意不关闭会造成文件描述符泄漏。3. 单字符读写 fgetc / fputcint fputc(int c, FILE *stream); //写一个字符 int fgetc(FILE *stream); //读一个字符fputc写入字符putchar(a)等价于fputc(a,stdout)。fgetc读到字符返回对应值读到文件末尾/出错返回EOF(-1)。4. 按行读写 fgets / fputschar *fgets(char *s, int size, FILE *stream); int fputs(const char *s, FILE *stream);fgets最多读取size‑1字节末尾自动补\0会读取换行符\n出错/到文件末尾返回NULL安全防止越界。fputs写入字符串不会写入\0。gets函数不安全已经废弃。5. 块读写 fread / fwrite多用于二进制文件size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptr数据缓冲区首地址size单个元素字节大小nmemb元素个数stream文件流。返回成功返回实际读写的元素个数。6. 文件流定位函数int fseek(FILE *stream, long offset, int whence); long ftell(FILE *stream); void rewind(FILE *stream);fseek重定位读写位置whence取值SEEK_SET文件开头、SEEK_CUR当前位置、SEEK_END文件末尾。ftell获取当前位置距离文件开头的字节偏移。rewind将读写位置复位到文件开头。获取文件大小代码片段fseek(fp,0,SEEK_END); long len ftell(fp); rewind(fp);7. 格式化输出相关printf(); //输出到stdout fprintf(FILE *stream,...);//输出到指定文件流 sprintf(char *str,...); //输出到内存字符数组用于字符串格式化拼接四、主函数命令行传参int main(int argc, const char *argv[])argc命令行参数总个数。argv字符串指针数组保存各个参数字符串argv[0]是程序本身名字。示例./a.out 1.txt 2.txtargc3argv[0]“./a.out”argv[1]“1.txt”argv[2]“2.txt”。五、标准IO特点小结C库函数可移植性强。用户层自带缓冲区减少用户态内核态切换读写效率高。操作对象FILE*文件流指针。主要用于普通文件操作。
延伸阅读

更多相关文章

2026/10/22 10:38:22

又一个Mac截图神器,仅6.9M、原生免费还没订阅

大家都知道,我是一名程序员,用Mac电脑比较平凡(一般公司都是配mac)。 平时没啥爱好,就是分享一些AI技术、开源工具等等,除了写代码、写博客,一天下来截屏次数其实也不再少数。 以前我固定走两…

2026/10/18 18:27:09

血细胞检测数据集本质与使用边界解析

简介:本资源为面向计算机视觉与医学图像分析方向研究者及深度学习初学者的血细胞检测专用数据集,旨在支撑红细胞、白细胞、血小板等多类血细胞的识别、分割与分类模型训练与评估。数据集结构规范,共1753个文件,含874张高质量JPG显…

2026/10/23 9:54:51

FreeRDP命令行实战:Windows远程桌面批量连接与参数配置指南

上周有个做运维的朋友甩过来一句抱怨:手头二十多台 Windows 机器的远程会话,每天要一台台点开系统自带的远程桌面连接、填地址、填账号、点确定,一天下来手指头都酸了,更别提还要在几个会话之间来回切着看日志。他问我有没有办法把…

2026/10/23 9:54:51

Linux安装微信的真相:四大路径实测与决策指南

1. 为什么“在Linux系统中安装微信”是个高频却总被误答的问题 “如何在Linux系统中安装微信”——这个搜索词每天在各大技术社区、问答平台和新手群组里出现数百次。它看起来简单,但背后藏着一个典型的认知断层:多数提问者真正想问的,不是“…

2026/10/23 9:54:51

CubeStudio多集群演进:从单机到多资源组的GPU算力平台实践

最早跑CubeStudio单机版的时候,一台双卡机器加一块共享存储就能把模型开发、训推的流程全部兜住。但等团队多了、项目组多了、GPU卡不够分的时候,你很快会发现单机这摊事根本撑不住。要么排队排到天荒地老,要么不同项目的环境互相干扰&#x…

2026/10/23 9:54:51

MATLAB实战:MFCC特征提取全链路拆解与避坑指南

简介:这份MATLAB代码资源聚焦梅尔倒谱系数(MFCC)的完整实现,面向语音识别、情感分析与语音合成方向的学习者和开发者,尤其适合希望从零理解特征提取流程的初学者,也可作为专业人士的可靠工具。代码按预加重…

2026/10/23 9:54:50

力扣高效刷题指南:从新手到算法高手

1. 为什么选择力扣作为算法练习平台作为一名从传统CRUD业务转型到算法领域的开发者,我最初接触力扣(LeetCode)时也经历过一段迷茫期。经过5年持续刷题和3次大厂面试实战后,我深刻理解到这个平台的设计价值。力扣的题目库覆盖了算法…

2026/10/23 9:49:48

.Net Core 2.1 JWT身份认证实战:从Token生成到问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑