标准I/O基础概念

标准I/O(Standard Input/Output)是C语言提供的一组高级文件操作函数,位于<stdio.h>头文件中。与低级I/O(如Unix的系统调用read/write)相比,标准I/O引入了缓冲机制,能显著提升读写效率。核心概念包括:

  • 文件指针(FILE*:指向FILE结构的指针,用于标识打开的文件流
  • 缓冲类型:全缓冲、行缓冲、无缓冲
  • 文本流与二进制流:文本流会处理换行符转换,二进制流直接读写原始数据

文件打开与关闭

fopen函数

FILE *fopen(const char *filename, const char *mode);

  • 参数:

    • filename:文件路径字符串
    • mode:打开模式:
      • "r":只读(文件必须存在)
      • "w":只写(创建新文件或清空已有文件)
      • "a":追加(在文件末尾写入)
      • "r+":读写(文件必须存在)
      • "w+":读写(创建新文件或清空已有文件)
      • "a+":读写(从文件末尾开始)
      • 附加b表示二进制模式(如"rb"
  • 返回值:成功返回FILE指针,失败返回NULL

fclose函数

int fclose(FILE *stream);

  • 参数:要关闭的文件流指针
  • 返回值:成功返回0,失败返回EOF
  • 注意:关闭前会刷新缓冲区,多次关闭同一流会导致未定义行为

字符I/O操作

fgetc函数

int fgetc(FILE *stream);

  • 从指定流读取一个字符
  • 返回值:成功返回读取的字符(转为unsigned char再转int),失败或到达文件尾返回EOF

fputc函数

int fputc(int c, FILE *stream);

  • 向指定流写入一个字符
  • 参数:c会被转为unsigned char写入
  • 返回值:成功返回写入的字符,失败返回EOF

使用示例:

// 文件复制示例
FILE *src = fopen("input.txt", "r");
FILE *dst = fopen("output.txt", "w");
int ch;
while ((ch = fgetc(src)) != EOF) {fputc(ch, dst);
}
fclose(src);
fclose(dst);

行I/O操作

fgets函数

char *fgets(char *str, int n, FILE *stream);

  • 从流中读取最多n-1个字符到str缓冲区
  • 遇到换行符或EOF时停止,换行符会被保留
  • 缓冲区末尾自动添加'\0'
  • 返回值:成功返回str指针,失败或到达文件尾返回NULL

fputs函数

int fputs(const char *str, FILE *stream);

  • 将字符串写入流,不包含结尾的'\0'
  • 返回值:成功返回非负值,失败返回EOF

使用示例:

// 行计数示例
FILE *fp = fopen("file.txt", "r");
char buffer[256];
int lines = 0;
while (fgets(buffer, sizeof(buffer), fp)) {lines++;
}
fclose(fp);

格式化I/O操作

fscanf函数

int fscanf(FILE *stream, const char *format, ...);

  • 从流中按指定格式读取数据
  • 格式字符串与scanf相同
  • 返回值:成功匹配并赋值的参数个数,失败或到达文件尾返回EOF

fprintf函数

int fprintf(FILE *stream, const char *format, ...);

  • 按指定格式向流写入数据
  • 格式字符串与printf相同
  • 返回值:成功写入的字符数,失败返回负值

使用示例:

// 结构化数据读写
typedef struct {int id;char name[50];float score;
} Student;FILE *fp = fopen("data.txt", "w+");
Student s = {1, "Alice", 95.5f};
fprintf(fp, "%d %s %f\n", s.id, s.name, s.score);rewind(fp);
Student new_s;
fscanf(fp, "%d %49s %f", &new_s.id, new_s.name, &new_s.score);
fclose(fp);

错误处理与状态检查

  • ferror:检查流错误标志

    int ferror(FILE *stream);
    

  • feof:检查文件结束标志

    int feof(FILE *stream);
    

  • clearerr:清除错误和EOF标志

    void clearerr(FILE *stream);
    

正确使用模式:

while (1) {ch = fgetc(fp);if (feof(fp)) break;if (ferror(fp)) {perror("Read error");break;}// 处理字符
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918379.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918379.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918379.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数1000题学习笔记

1000题线代基础第一章1-101000题线代基础第二章1-171000题线代基础第三章1-11

LeetCode算法日记 - Day 8: 串联所有单词的子串、最小覆盖子串

目录 1.串联所有单词的子串 1.2 解法 1.3 代码实现 2. 最小覆盖子串 2.1 题目解析 2.2 解法 2.3 代码实现 1.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度…

linux实战:基于Ubuntu的专业相机

核心组件就是QTimerOpenCV的组合方案摄像头启停控制用QPushButton实现&#xff0c;帧显示必须用QLabel而不能用普通控件&#xff0c;视频流刷新用QTimer比多线程更简单想快速实现摄像头控制功能&#xff0c;核心组件就是QTimerOpenCV的组合方案。摄像头启停控制用QPushButton实…

《深度剖析前端框架中错误边界:异常处理的基石与进阶》

错误边界作为一种特殊的组件机制&#xff0c;正悄然重塑着应用应对异常的底层逻辑。它并非简单的代码片段组合&#xff0c;而是一套贯穿组件生命周期的防护体系&#xff0c;其核心价值在于将局部错误的影响牢牢锁定在可控范围内&#xff0c;避免整个应用陷入不可挽回的崩溃状态…

6GB显存玩转SD微调!LoRA-scripts本地部署教程,一键炼出专属AI画师

一、介绍LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一个专为训练低秩自适应&#xff08;LoRA&#xff09;模型设计的开源工具集主要应用于Stable Diffusion等AI绘图模型的微调&#xff0c;帮助用户高效创建定制化风格、角色或概念的轻量级模型。目前已…

探索AI的数学奇迹:Gemini 2.5 Pro如何摘得IMO金牌

🌍 引言:从人类天才到AI奇才的跨越 想象一下,一个AI模型坐在国际数学奥林匹克(IMO)的考场里,手里拿着笔(好吧,其实是处理token),面对那些让高中生们头疼不已的难题。它不是靠死记硬背,而是通过深思熟虑的推理,一步步攻克难关。这听起来像科幻小说,但2025年,这已…

MCP学习与实践

目录 1.MCP简介 1.1 MCP是什么 1.2 MCP与Agent关系&#xff1a; 1.3 MCP的架构 2. MCP原理 2.1 MCP 工作过程 2.2 MCP 通讯方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地图MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文详细讲解了什么是…

MySQL(187)如何使用pt-query-digest进行查询分析?

使用 pt-query-digest 工具可以帮助分析 MySQL 查询的性能&#xff0c;找出慢查询、频繁查询以及消耗资源较多的查询&#xff0c;从而为优化提供依据。以下是详细深入的使用 pt-query-digest 进行查询分析的步骤和相关示例。 一、安装 pt-query-digest pt-query-digest 是 Perc…

分享一个基于Python和Hadoop的的电信客户特征可视化分析平台 基于Spark平台的电信客服数据存储与处理系统源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

初识STL

一 、STL的诞生在C发展早期&#xff0c;程序员在不同的项目中需要反复编写相似的数据结构和算法。重复开发带来以下问题&#xff1a;代码冗余&#xff1a;每个项目都要重新实现基本数据结构和算法维护困难&#xff1a;不同人编写的代码风格不一致&#xff0c;难以维护效率低下&…

DDoS 防护的未来趋势:AI 如何重塑安全行业?

随着网络攻击规模和复杂性的不断升级&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击已成为企业数字化转型中的一大威胁。传统防御手段在应对智能化、动态化的攻击时逐渐显露出局限性。而人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;正为 DDoS 防护…

【每天一个知识点】深度领域对抗神经网络

Deep Domain Adversarial Neural Network&#xff08;深度领域对抗神经网络&#xff0c;DDANN&#xff09; 是一类结合 深度学习 与 领域自适应&#xff08;domain adaptation&#xff09; 思想的神经网络结构&#xff0c;主要用于不同数据域之间的知识迁移&#xff0c;尤其是在…

【C语言】深入理解预处理

文章目录一、预定义符号二、#define定义常量&#xff1a;便捷的符号替换常见用法示例&#xff1a;注意事项&#xff1a;三、#define定义宏&#xff1a;带参数的文本替换关键注意点&#xff1a;四、带有副作用的宏参数五、宏替换的规则&#xff1a;预处理的执行步骤重要注意&…

展锐平台(Android15)WLAN热点名称修改不生效问题分析

前言 在展锐Android V项目开发中&#xff0c;需要修改softAp/P2P热点名称时&#xff0c;发现集成GMS后直接修改framework层代码无效。具体表现为&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法编译烧录后修改不生效 问题根源在…

wsl ubuntu访问(挂载)vmware vmdk磁盘教程

之前使用VMware Workstation 虚拟机跑了个ubuntu&#xff0c;现在改用wsl了&#xff0c; 想把vmware的磁盘挂载到wsl ubuntu。一、磁盘合并我原先的vmware跑的ubuntu存在多个vmdk文件&#xff08;磁盘文件&#xff09;&#xff0c;需要先将磁盘合并成一个才方便挂载。首先你电脑…

UGUI源码剖析(3):布局的“原子”——RectTransform的核心数据模型与几何学

UGUI源码剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心数据模型与几何学 在前几章中&#xff0c;我们了解了UGUI的组件规范和更新调度机制。现在&#xff0c;我们将深入到这个系统的“几何学”核心&#xff0c;去剖析那个我们每天都在…

c++注意点(15)----设计模式(桥接模式与适配器模式)

一、结构型设计模式两者有点相似&#xff0c;都是为了做到解耦的功能。适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&…

DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!

作为我常用的一款还不错的跨境工具&#xff0c;DuoPlus云手机帮我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和优化&#xff0c;今天来聊聊它最近新更新的一些功能。功能更新一览新增导入文件配置参数&#xff1a;批量初始化代理、批量修改参数支持导入文件一键配…

PLC如何实现通过MQTT协议物联网网关接入管理云平台

在工业4.0与智能制造浪潮下&#xff0c;企业亟需实现设备数据的高效采集与云端协同&#xff0c;以支撑远程监控、预测性维护等场景。工业智能网关凭借其强大的协议解析能力、边缘计算功能及安全传输机制&#xff0c;成为PLC接入云平台的核心解决方案。本文将从技术架构、功能模…

通过sealos工具在ubuntu 24.02上安装k8s集群

一、系统准备&#xff08;1&#xff09;安装openssh服务 sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh&#xff08;2&#xff09;放通防火墙 sudo ufw allow ssh&#xff08;3&#xff09;开通root直接登录 vim /etc/ssh/sshd_config#…