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

嵌入式Linnux学习 -- 软件编程2

四、IO

1. 概念

1.  IO 指 input / output

2.  Linux系统中一切皆是文件

3.  IO操作的对象是文件

2. 文件

1. 概念

一段数据的集合

2. 特点

文件通常存放在外存中,掉点后数据不会丢

3. 分类

  • b(block,块设备文件)

 -- 按块扫描信息的文件,通常用于存储设备

 -- 数据读写以固定大小块为单位,支持随机访问

 -- 文件IO

  • c(character,字符设备文件)

 -- 按字符扫描信息的文件,通常用于串行设备

 -- 数据是流式的,通常不支持随机访问

 -- 文件IO

  • d(directory,目录文件)

 -- 表示一个目录,用于存放其他文件和子目录的文件夹

 -- 目录IO/文件IO

  • -(普通文件)

 -- 常见的文件类型,存放一般信息的文件

 -- 标准IO/文件IO

  • l(link,链接文件)

 -- 操作文件等价于操作文件指向的文件

 -- 链接IO/文件IO

  • s(socket,套接字文件)

 -- 用来进程间通信,用于网络通信或本地进程通信

 -- 文件IO

  • p(pipe,管道文件)

 -- 用来进程间通信,一种单向数据通道,用于命令间的数据传递

 -- 文件IO

3. 标准IO

1. 概念

用来操作普通文件

2. 文件类型

1. ASCII码文件

文件中的所有内容均为能够在屏幕上显示的ASCII码字符

程序、文本文件均为ASCII码文件

2. 二进制文件

文件中的所有内容均为数据对应的二进制形式存放,包含一些不能在界面上显示的内容

ASCII码文件也是二进制文件

图片、音视频、压缩包均为二进制文件

3. 标准IO的接口

1. fopen / fclose

2. fgetc / fputc

3. fgets / fputs

4. fscanf / fprintf

5. fread / fwrite

6. fseek / rewind/ftell

4. 流

stdin:标准输入流

stdout:标准输出流

stderr:标准出错流

printf、puts、putchar        通过stdout流实现在终端信息打印

scanf、gets、getchar       通过stdin流实现获得终端信息

perror                                通过stderr流实现在终端打印出错信息

5. 文件的打开

1. fopen
  • 原型:FILE *fopen(const char *pathname, const char *mode);
  • 功能:

        打开pathname指向字符串对应的文件,并且和它建立一个流

  • 参数:

        pathname:要打开的文件路径字符串,mode:打开的方式

  • 返回值:

    成功返回FILE*指针, 失败返回NULL

        r       只读             文件存在只读打开,文件不存在报错
r+     读写             文件存在读写打开,文件不存在报错
w      只写             文件存在清零,文件不存在创建,只写打开
w+    写读            文件存在清零,文件不存在创建,写读打开
a       追加            文件存在追加,文件不存在创建,只写打开
a+    追加读写      文件存在追加,文件不存在创建,写读打开

2. fclose
  • 原型:int fclose(FILE *stream);
  • 功能:

        关闭已经打开的流

  • 参数:

        stream:文件流指针

  • 返回值:

        成功返回0,失败返回EOF(-1)

3. fputc
  • 原型:int fputc(int c, FILE *stream);
  • 功能:

        将字符c写入流中

  • 参数:

        c:要写入的字符,stream:文件流指针

  • 返回值:

        成功返回输出的ASCII码值, 失败返回EOF

putchar() 等价于 fputc(ch, stdout)

4. fgetc
  • 原型:int fgetc(FILE *stream);
  • 功能:

        读取流中的下一个字符

  • 参数:

        stream:文件流指针

  • 返回值:

        成功返回读到字符的ASCII码值,失败或者读到文件末尾返回EOF

ch = getchar() 等价于 ch = fgetc(stdin)

        

5. fputs
  • 原型:int fputs(const char *s, FILE *stream);
  • 功能:

        向流中写入s指向的字符串

  • 参数:

        s:要写入的字符串的首地址,stream:文件流指针

  • 返回值:

        成功返回非负数,失败返回EOF

6. fgets
  • 原型:char *fgets(char *s, int size, FILE *stream);
  • 功能:

        从流中最多读size-1个字节数据放入s指向的空间中,遇到\n读取截止

  • 参数:

        s:存放数据空间的首地址,size:最多存放元素的个数,stream:文件流指针

  • 返回值:

        成功返回存放数据空间的首地址

        失败返回NULL,读到文件末尾返回NULL

fputs不会多打印\n字符,puts会多打印一个\n字符

gets会去掉从终端接收的\n字符,fgets不会去掉从终端接收的\n字符

7. fprintf
  • 原型:int fprintf(FILE *stream, const char *format, ...);
  • 功能:

        将格式化的字符串打印在流中

  • 参数:

        stream:文件流指针, format:格式化的字符串,   ...:参数

  • 返回值:

        成功返回打印字符的个数

        失败返回负数

8. fscanf
  • 原型:int fscanf(FILE *stream, const char *format, ...);
  • 功能:

        从流中接收格式化的字符串

  • 参数:

        stream:文件流指针, format:格式化字符串        ...:参数

  • 返回值:

        成功返回匹配的输入控制符的个数

        失败返回EOF,读到文件末尾返回EOF

4. 标准IO的缓存

1. 类型

1. 全缓存(4k)

1.缓存区满刷新缓存

2.刷新条件:

        缓存区满4k刷新

        fflush函数强制刷新

        fclose或者程序关闭刷新

3.与文件建立的缓存一般为全缓存

2. 行缓存(1k)

1. 遇到\n刷新缓存区

2. 刷新条件:

        缓存区满1k刷新

        遇到\n刷新

        fflush函数强制刷

        fclose或者程序关闭刷新

3. 与终端建立的缓存一般为行缓存(stdin、stdout均为行缓存)

3. 不缓存(0k)

1. 立即刷新不缓存

2. 刷新条件:

        不缓存立即刷新

3. 出错处理或者人机交互一般使用不缓存(stderr不缓存)

2. 标准IO的缓存

1. 特点

        标准IO是一种有缓存的IO

        效率高

        实时性差

2. 标准IO 与 文件IO

标准IO:用户代码 → 库函数 → 缓存 → 内核

  • 路径更长,但效率高。

  • 缓存由标准库管理

文件IO:用户代码 → 内核

  • 直接通过open(),read(),write()等系统调用操作,无中间缓冲区。

  • 实时性强,但频繁调用效率低

http://www.lryc.cn/news/617298.html

相关文章:

  • uart通信中出现乱码,可能的原因是什么 ?
  • 借助 ChatGPT 快速实现 TinyMCE 段落间距与行间距调节
  • Nmap 渗透测试弹药库:精准扫描与隐蔽渗透技术手册
  • 什么是结构化思维?什么是结构化编程?
  • 计算机网络(一)——TCP
  • Vue脚手架模式与环境变量
  • 变频器实习DAY26 CDN 测试中心使用方法
  • Android16新特性速记
  • C语言如何安全的进行字符串拷贝
  • 从 GPT-2 到 gpt-oss:架构进步分析
  • 北京JAVA基础面试30天打卡07
  • Nacos-1--什么是Nacos?
  • 5G NR 非地面网络 (NTN)
  • JVM运维
  • C#(vs2015)利用unity实现弯管机仿真
  • 5G 非地面网络(NTN)最专业的方案
  • CSS accent-color:一键定制表单元素的主题色,告别样式冗余
  • 第2节 大模型分布式推理架构设计原则
  • XX生产线MES系统具体实施方案
  • 【Node.js从 0 到 1:入门实战与项目驱动】1.4 Node.js 的发展与生态(历史版本、LTS 版本、npm 生态系统)
  • CobaltStrike的搭建与使用
  • java基础概念(二)----变量(附练习题)
  • 【代码随想录day 17】 力扣 617.合并二叉树
  • 零外围双Buck 2C和2C1A!功率分配So Easy
  • Jmeter使用第二节-接口测试(Mac版)
  • MyBatis执行器与ORM特性深度解析
  • n8n中调用playwright-mcp 项目
  • ansible学习第一天
  • 定义短的魔术数字时小心负数的整型提升
  • Mybatis @Param参数传递说明