当前位置: 首页 > news >正文

标准io(1)

标准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.xdnf.cn/news/1280539.html

相关文章:

  • MySQL中GROUP_CONCAT函数的使用详解
  • 机器翻译:一文掌握序列到序列(Seq2Seq)模型(包括手写Seq2Seq模型)
  • ssh 远程连接加密算法报错
  • MyBatis执行器与ORM特性深度解析
  • 十二、Linux Shell脚本:正则表达式
  • 导入CSV文件到MySQL
  • 打破内网枷锁!TRAE SOLO + cpolar 让AI开发告别“孤岛困境”
  • 腾讯 iOA 测评 | 横向移动检测、病毒查杀、外设管控、部署性能
  • 浏览器CEFSharp+X86+win7 之 测试抖音小店订单抓取(八)
  • 运动规划实战案例 | 基于多源流场(Flow Field)的路径规划(附ROS C++/Python实现)
  • Nmap 渗透测试弹药库:精准扫描与隐蔽渗透技术手册
  • Qt串口通信设计指南:通信层架构与实践
  • [go] 命令模式
  • 【软考架构】主流数据持久化技术框架
  • android 换肤框架详解1-换肤逻辑基本
  • 2025第十六届蓝桥杯大赛青少组省赛C++真题(初级组和中级组)
  • 数学建模——灰色预测(GM11)
  • 北京JAVA基础面试30天打卡07
  • HTTPS的应用层协议
  • react+vite-plugin-react-router-generator自动化生成路由
  • 安全等级认证系列 | 星环ArgoDB获CC EAL2安全认证,数据安全实力获国际认可
  • Linux入门DAY21
  • 用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖
  • 读《精益数据分析》:媒体内容平台全链路梳理
  • 低延迟RTSP|RTMP视频链路在AI驱动无人机与机器人操控中的架构实践与性能优化
  • TRS(总收益互换)系统架构设计:多市场交易的技术实现分析
  • 每日五个pyecharts可视化图表-line:从入门到精通 (3)
  • 常用设计模式系列(十九)- 状态模式
  • 闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计
  • HBase BlockCache:LRU Cache