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

Linux 软件编程:IO——标准IO

一、IO 基本概念

  1. 定义:IO 指 input/output(输入 / 输出)。
  2. 核心特点:在 Linux 系统中,一切皆是文件,IO 操作的对象是文件。

二、文件相关内容

  • 文件的定义:一段数据的集合,通常存放在外存中,掉电后数据不会丢失。
  • 文件分类及对应 IO 操作
  1. 分类子项具体内容
    文件分类块设备文件(b)按块扫描信息,通常为存储设备,对应文件 IO 操作123
    字符设备文件(c)按字符扫描信息,一般为普通设备,对应文件 IO 操作456
    目录文件(d)存放文件的文件夹,对应目录 IO / 文件 IO 操作789
    普通文件(-)存放信息的文件,分 ASCII 码文件(如程序、文本)和二进制文件(如图片、音视频),对应标准 IO / 文件 IO 操作10111213
    链接文件(l)操作等价于操作指向的文件,对应链接 IO / 文件 IO 操作151617
    套接字文件(s)用于进程间通信,对应文件 IO 操作181920
    管道文件(p)用于进程间通信,对应文件 IO 操作

三、标准 IO

  1. 概念:通常用来操作普通文件。
  2. 普通文件类型
    • ASCII 码文件:文件中的所有内容均为能够在屏幕上显示的 ASCII 码字符,程序、文本文件均为此类。
    • 二进制文件:文件中的所有内容均为数据对应的二进制形式存放(包含一些不能在界面上显示的内容),图片、音视频、压缩包均为此类,且 ASCII 码文件本质也是二进制文件。
  3. 标准 IO 的接口
    • fopen/fclose
    • fgetc/fputc
    • fgets/fputs
    • fscanf/fprintf
    • fread/fwrite
    • fseek/rewind/ftell
  4. 操作步骤
    1. 打开文件
    2. 读写文件
    3. 关闭文件
  5. 文件的打开与关闭
    • fopen 函数
      • 原型:FILE *fopen(const char *pathname, const char *mode);
      • 功能:打开 pathname 指向字符串对应的文件,并和它建立一个流。
      • 参数:pathname 为要打开的文件路径字符串;mode 为打开方式。
      • 打开方式说明:
        • 只读:文件存在只读打开,文件不存在报错。
        • r+:读写,文件存在读写打开,文件不存在报错。
        • w:只写,文件存在清 0,文件不存在创建,只写打开。
        • w+:写读,文件存在清 0,文件不存在创建,写读打开。
        • a:追加,文件存在追加,文件不存在创建,只写打开。
        • a+:追加读写,文件存在追加,文件不存在创建,读写打开。
      • 返回值:成功返回 FILE* 指针,失败返回 NULL。
    • fclose 函数
      • 原型:int fclose(FILE *stream);
      • 功能:关闭已经打开的流。
      • 参数:stream 为文件流指针。
      • 返回值:成功返回 0,失败返回 EOF(-1)。
  6. 字符读写函数
    • fputc 函数
      • 原型:int fputc(int c, FILE *stream);
      • 功能:将字符 c 写入流中。
      • 参数:c 为要写入的字符;stream 为文件流指针。
      • 返回值:成功返回输出的 ASCII 码值,失败返回 EOF。
      • 注意:putchar () 等价于 fputc (ch, stdout)。
    • fgetc 函数
      • 原型:int fgetc(FILE *stream);
      • 功能:读取流中的下一个字符。
      • 参数:stream 为文件流指针。
      • 返回值:成功返回读到字符的 ASCII 码值,失败或者读到文件末尾返回 EOF。
      • 注意:ch = getchar () 等价于 ch = fgetc (stdin)。
  7. 字符串读写函数
    • fputs 函数
      • 原型:int fputs(const char *s, FILE *stream);
      • 功能:向流中写入 s 指向的字符串。
      • 参数:s 为要写入的字符串的首地址;stream 为文件流指针。
      • 返回值:成功返回非负数,失败返回 EOF。
      • 注意:fputs 不会多打印 \n 字符,而 puts 会多打印一个 \n 字符。
    • fgets 函数
      • 原型:char *fgets(char *s, int size, FILE *stream);
      • 功能:从流中最多读 size-1 个字节数据放入 s 指向的空间中,遇到 \n 读取截止。
      • 参数:s 为存放数据空间的首地址;size 为最多存放元素的个数;stream 为文件流指针。
      • 返回值:成功返回存放数据空间的首地址,失败或读到文件末尾返回 NULL。
      • 注意:gets 会去掉从终端接收的 \n 字符,fgets 不会去掉从终端接收的 \n 字符。
  8. 格式化读写函数
    • fprintf 函数
      • 原型:int fprintf(FILE *stream, const char *format, ...);
      • 功能:将格式化的字符串打印在流中。
      • 参数:stream 为文件流指针;format 为格式化的字符串;... 为参数。
      • 返回值:成功返回打印字符的个数,失败返回负数。
    • fscanf 函数
      • 原型:int fscanf(FILE *stream, const char *format, ...);
      • 功能:从流中接收格式化的字符串。
      • 参数:stream 为文件流指针;format 为格式化字符串;... 为参数。
      • 返回值:成功返回匹配的输入控制符的个数,失败或读到文件末尾返回 EOF。
  9. 已打开的三个特殊的流
    • stdin:标准输入流
    • stdout:标准输出流
    • stderr:标准出错流
    • 说明:printf、puts、putchar 都是通过 stdout 流实现在终端信息打印;scanf、gets、getchar 都是通过 stdin 流实现获得终端信息;perror 通过 stderr 流实现在终端打印出错信息。

四、标准 IO 的缓存

  1. 特点:标准 IO 是一种有缓存的 IO,效率高,但实时性差。
  2. 缓存的类型
    • 全缓存(4k)
      • 刷新条件:缓存区满 4k 刷新;fflush 函数强制刷新;fclose 或者程序关闭刷新。
      • 说明:与文件建立的缓存一般为全缓存。
    • 行缓存(1k)
      • 刷新条件:缓存区满 1k 刷新;遇到 \n 刷新;fflush 函数强制刷新;fclose 或者程序关闭刷新。
      • 说明:与终端建立的缓存一般为行缓存(stdin、stdout 均为行缓存)。
    • 不缓存(0k)
      • 刷新条件:不缓存立即刷新。
      • 说明:出错处理或者人机交互一般使用不缓存(stderr 不缓存)。
http://www.dtcms.com/a/326486.html

相关文章:

  • 《录井管理与工程》书籍第一章要点及相应思考
  • 工业数采引擎-通信协议(Modbus/DTU/自定义协议)
  • FFmepg源码系列-avformat_open_input()
  • python之uv使用
  • [动态规划]最长公共子序列(LCS)
  • Nacos添加权限
  • uart通信中出现乱码,可能的原因是什么 ?
  • Linux软件编程:标准IO(ASCII文件)
  • Discuz论坛和java应用的架构部署
  • 视频剪辑的工作流程
  • 笔试——Day35
  • 用 Flink SQL 和 Paimon 打造实时数仓:深度解析与实践指南
  • GitHub的简单使用方法----(1)
  • 论文阅读 arxiv 2024 MemGPT: Towards LLMs as Operating Systems
  • 平衡二叉树(AVL)解析与实现
  • python每日一题 1的数量 非常简单
  • 松灵机器人 scout ros2 galactic 驱动 安装,并且跑巡线算法
  • 深入剖析 C++ STL 中的 std::list 容器
  • 一篇文章解决Unity没有添加模块选项的问题
  • Linux系统编程 | 线程池
  • Redis7 GEO功能介绍与电商场景案例解析
  • Static CXL Switch:静态CXL交换机相关内容
  • leecode875 爱吃香蕉的珂珂
  • 【Unity】打包学习笔记
  • pip 和 conda,到底用哪个安装?
  • 【已解决】【obsidian插件开发】svg图标路径不正确
  • 第16届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2025年1月12日真题
  • 机器翻译:一文掌握序列到序列(Seq2Seq)模型(包括手写Seq2Seq模型)
  • 豆包 + 蘑兔 AI:音乐创作的梦幻组合
  • UE5太空射击游戏入门(二):场景搭建与自动飞行