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

IO 核心要点(1)

第一章:IO 核心要点


一、IO 概念
  1. 定义

    • I/O:程序与操作系统或用户之间的数据交互。
      • Input:数据从外部设备输入到内存。
      • Output:数据从内存输出到外部设备。
  2. 历史回顾

    • stdio.h 常用函数:scanf, printf, getchar, putchar, gets, puts
  3. 分类

    • 按操作方式:串行、同步、异步、设备、阻塞 IO 等。
    • 阻塞 IO 细分
      • 标准 IO:程序与用户间的交互(带缓冲区)。
      • 文件 IO:程序与文件系统间的交互(无缓冲区)。

二、标准 IO vs 文件 IO(面试重点)

特性标准 IO文件 IO
缓冲区有缓冲区,数据满或条件满足后刷新无缓冲区,直接调用系统函数写入文件
标准遵循 ANSI 标准,跨平台兼容性强遵循 POSIX 标准,仅类 UNIX 系统可用
效率读取速度快(缓冲减少系统调用)读取速度慢(频繁系统调用)
操作对象普通文件特殊文件(套接字、管道、设备文件等)
标识符使用 FILE* 流指针使用文件描述符(int 类型)

三、标准 IO 函数
  1. 核心函数列表

    • 打开/关闭fopen, fclose
    • 字符读写fgetc, fputc
    • 字符串读写fgets, fputs
    • 格式化读写fprintf, fscanf
    • 二进制读写fread, fwrite
    • 文件定位fseek, rewind, ftell
  2. 关键函数详解

    • fopen

      • 模式r(只读)、r+(读写)、w(覆盖写)、w+(读写覆盖)、a(追加)、a+(读写追加)。
      • 返回值:成功返回 FILE*,失败返回 NULL
    • 流指针(FILE*

      • 维护缓冲区信息(起始/结束地址、读写指针位置等)。
      • 结构体 _IO_FILE 包含文件描述符 _fileno 和缓冲区指针。
    • 错误处理

      • perror(const char *s):输出错误信息及描述。
      • strerror(int errnum):返回错误码对应的字符串。
  3. 缓冲区计算

    • 缓冲区大小 = _IO_buf_end - _IO_buf_base

四、重要函数使用场景
  1. fgetsfputs

    • fgets 读取时自动添加 \0,最多读 size-1 个字符,遇到 \n 或文件尾停止。
    • 示例:fgets(str, sizeof(str), fp)
  2. 二进制读写(fread/fwrite

    • 参数:数据地址、单元素大小、元素个数、流指针。
    • 示例:fwrite(arr, sizeof(int), 3, fp) 写入数组前3个整数。
  3. 文件定位

    • fseek:移动文件指针到指定位置(SEEK_SET/SEEK_CUR/SEEK_END)。
    • ftell:返回当前指针位置。
    • rewind:重置指针到文件开头。

五、作业与实践
  1. 文件拷贝:使用 freadfwrite 实现二进制文件复制。
    #include "headhs.h"
    #include <stdio.h>int main()
    {FILE *src, *dest;char ch;// 打开源文件src = fopen("one.txt", "r");if (src == NULL){perror("无法打开源文件");return 1;}// 打开目标文件dest = fopen("two.txt", "w");if (dest == NULL){perror("无法打开目标文件");fclose(src);return 1;}// 逐字符拷贝while ((ch = fgetc(src)) != EOF){fputc(ch, dest);}// 关闭文件fclose(src);fclose(dest);printf("文件拷贝成功!\n");return 0;
    }

  2. 统计文件行数:通过 fgets 逐行读取并计数。
    #include "headhs.h"
    #include <stdio.h>
    int main()
    {FILE *file;char line[256];int line_count = 0;// 打开文件file = fopen("one.txt", "r");if (file == NULL){perror("无法打开文件");return 1;}// 逐行读取并计数while (fgets(line, sizeof(line), file)) {line_count++;}// 关闭文件fclose(file);// 输出行数printf("文件的行数为: %d\n", line_count);return 0;
    }

  3. 思维导图:梳理标准 IO 函数分类及关系。
  4. 牛客网刷题:巩固文件操作相关知识点。

六、其他注意事项
  • 错误码errno 范围 1~133,需包含 <errno.h>
  • 开发工具:使用 ctags 追代码(ctrl+] 跳转,ctrl+t 返回)。
  • 结构体写入:如学生信息需转换为二进制写入,避免直接文本写入。

http://www.xdnf.cn/news/120727.html

相关文章:

  • 基于 EFISH-SBC-RK3588 的无人机智能巡检终端方案‌
  • 5G/6G通信设备中的盲埋孔技术突破
  • 数据结构-查找
  • 第六章 QT基础:5、QT的UDP网络编程
  • 【前端】【业务场景】【面试】在前端开发中,如何实现实时数据更新,比如实时显示服务器推送的消息,并且保证在不同网络环境下的稳定性和性能?
  • 如何轻松将 Python 英文版切换至中文界面
  • 垂直分表和水平分表涉及的不同场景?如何决定使用水平分表还是垂直分表?
  • HT7180输入电压2.7-12V输出电压最高12.8V禾润一级代理聚能芯半导体
  • 【verilog】单/多if语句优先级
  • 大数据赋能零售,打造个性化购物新纪元
  • UML 活动图深度解析:以在线购物系统为例
  • 深入了解递归、堆与栈:C#中的内存管理与函数调用
  • 第二篇:Django配置及ORM操作
  • 【mongodb】系统保留的数据库名
  • 复杂性决策-思维训练
  • Linux之安装配置Nginx
  • 如何获取适用于视频编辑优化的谷歌浏览器【提升视频编辑体验】
  • ThreadLocal线程本地量
  • 第六章:LangChain - LCEL 驱动的高级 RAG 实战
  • html单页业务介绍源码
  • Day11(回溯法)——LeetCode79.单词搜索
  • 26考研|数学分析:数项级数
  • PyQt6基础_QTabWidget
  • 基于霍尔效应传感器的 BLDC 电机梯形控制方案详解
  • JVM性能优化之年轻代参数设置
  • 23种设计模式-行为型模式之模版方法模式(Java版本)
  • Opencv图像处理:旋转、打包、多图像匹配
  • 嵌入式面试高频考点深度解析:内存管理、指针操作与结构体实战指南
  • 高德MCP制作旅游攻略
  • Volcano 实战快速入门 (一)