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

【学习嵌入式day-22-Linux软件编程-IO】

IO

概念

IO是指input/output

linux系统中一切都是文件,IO操作的对象是文件

文件

存放在磁盘中的一段数据的集合

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

分类:

  • b (block块设备文件)
    • 按块扫描信息的文件,称为块设备文件。通常存储类型的设备为块设备文件
    • 使用文件相关的IO
  • c   (character,字符设备文件)
    • 按字符扫描信息的文件,称为字符设备文件,一般设备通常为字符设备文件
    • 文件IO
  • d   (directory,目录文件)
    • 目录文件,存放文件的文件夹
    • 目录IO、文件IO
  • - (普通文件)
    • 存放信息的文件
    • 标准IO、文件IO
  • l (Link,链接文件)
    • 操作文件等价于操作文件指向的文件
    • 链接IO、文件IO
  • s (socket,套接字文件)
    • 用来进程间通信
    • 文件IO
  • p (pipe,管道文件)
    • 用来进程间通信
    • 文件IO

标准IO

通过用来操作普通文件

普通文件类型

  • ASCII码文件:文件中所有内容均为能够在屏幕上显示的ASCII码字符
    • 程序、文本文件均为ASCII码文件
  • 二进制文件:文件中所有内容均为数据对应的二进制形式存放(包含一些不能在界面上显示的内容)
    • ASCII码文件也是二进制文件
    • 图片、音视频、压缩包均为二进制文件

标准IO的接口

  • fopen/fclose
  • fgetc/fputc
  • fgets/fputs
  • fscanf/fprintf
  • fread/fwrite
  • fseek/rewind/ftell
  • 操作步骤
    • 打开文件
    • 读写文件
    • 关闭文件

文件的打开

fopen

w        会清空文件的内容

w+        清空文件内容

fclose

使用fgetc和fputc完成文件拷贝

//将源文件的内容拷贝到目的文件中去#include <stdio.h>void copy_file_content(char *pdstfile, char *psrcfile)
{FILE *fsrc = NULL;FILE *fdst = NULL;char ch = 0;fsrc = fopen(psrcfile, "r");if (NULL == fsrc){perror("fail to fopen");return;}fdst = fopen(pdstfile, "w");if (NULL == fdst){perror("fail to fopen");return;}while (1){ch = fgetc(fsrc);if (EOF == ch){break;}fputc(ch, fdst);}fclose(fsrc);fclose(fdst);return;
}int main(void)
{char srcfile[256] = {0};char dstfile[256] = {0};printf("请输入源文件:\n");gets(srcfile);printf("请输入目的文件:\n");gets(dstfile);copy_file_content(dstfile, srcfile);printf("拷贝完成\n");return 0;
}
fputc

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

fgetc

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

fputs

写一行数据时,使用fputs

  • fputs不会多打印 \n 字符
  • puts会多打印一个 \n 字符
#include <stdio.h>int main(void)
{FILE *fp = NULL;char tmpbuff[1024] = {"how are you"};fp = fopen("a.txt", "w");if(NULL == fp){perror("fail to fopen");return -1;}fputs("hello world\n", fp);fputs(tmpbuff, fp);return 0;
}
fgets

只想要一行数据时,使用fgets

  • gets会去掉从终端接收的 \n 字符
  • fgets不会去掉从终端接收的 \n 字符
#include <stdio.h>int main(void)
{FILE *fp = NULL;char tmpbuff[1024] = {0};char *pret = NULL;fp = fopen("a.txt", "r");if(NULL == fp){perror("fail to fopen");return -1;}while(1){pret = fgets(tmpbuff, sizeof(tmpbuff), fp);if(NULL == pret){break;}printf("tmpbuff = %s", tmpbuff);}printf("\n");fclose(fp);return 0;
}
fgets和fputs组合使用:
#include <stdio.h>
#include <string.h>int main(void)
{char tmpbuff[256] = {0};while (1){fgets(tmpbuff, sizeof(tmpbuff), stdin);tmpbuff[strlen(tmpbuff)-1] = '\0';if(0 == strcmp(tmpbuff, "quit")){break;}fputs(tmpbuff, stdout);fputs("\n", stdout);}return 0;
}
fprintf

fscanf

已经打开的三个特殊的流

  • stdin:标准输入流
  • stdout:标准输出流
  • srderr:标准出错流

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

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

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

标准IO的缓存

标准IO缓存:

是一种由缓存的IO、效率高、实时性差

缓存的类型

  • 全缓存(4k)
    • 缓存区满 刷新缓存
    • 刷新条件:
      • 缓存区满4k刷新
      • fflush函数强制刷新
      • fclose或者程序关闭刷新
    • 与文件建立的缓存一般为全缓存
  • 行缓存(1k)
    • 遇到\n 刷新缓存区
    • 刷新条件
      • 缓存区满1k(1024字节)刷新
      • 遇到\n刷新
      • fflush强制刷新
      • fclose或者程序关闭刷新
    • 与终端建立的缓存(stdin、stdout都是行缓存)
  • 不缓存(0k)
    • 立即刷新不缓存
    • 刷新条件
      • 不缓存立即刷新
    • 出错处理或者人机交互(stderr不缓存)

man手册

章节

  1. 系统命令
  2. 系统调用
  3. 库函数
  4. 设备说明
  5. 文件格式
  6. 娱乐
  7. 杂项
  8. 管理员命令

使用示例

man 章节号 搜索内容

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

相关文章:

  • SpringBoot集成支付宝二维码支付接口详解
  • Python3.10 + Firecrawl 下载 Markdown 文档:构建高效通用文章爬虫
  • 不同FPGA开发板系统移植步骤
  • Chrome插件开发【Service Worker练手小项目】
  • 【LeetCode刷题集】--排序(三)
  • 【智能的起源】人类如何模仿,简单的“刺激-反应”机制 智能的核心不是记忆,而是发现规律并能迁移到新场景。 最原始的智能:没有思考,只有简单条件反射
  • Mamba 原理汇总2
  • AI(2)-神经网络(激活函数)
  • 支持小语种的在线客服系统,自动翻译双方语言,适合对接跨境海外客户
  • 数据结构-数组扩容
  • 开发指南130-实体类的主键生成策略
  • Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南
  • 排错000
  • 基于 ZooKeeper 的分布式锁实现原理是什么?
  • windows上RabbitMQ 启动时报错:发生系统错误 1067。 进程意外终止。
  • 150V降压芯片DCDC150V100V80V降压12V5V1.5A车载仪表恒压驱动H6203L惠洋科技
  • git:分支
  • 提示词工程实战:用角色扮演让AI输出更专业、更精准的内容
  • 软件测评中HTTP 安全头的配置与测试规范
  • 数据变而界面僵:Vue/React/Angular渲染失效解析与修复指南
  • 基于 Axios 的 HTTP 请求封装文件解析
  • Console Variables Editor插件使用
  • 音视频学习(五十三):音频重采样
  • QT QProcess + xcopy 实现文件拷贝
  • Web安全自动化测试实战指南:Python与Selenium在验证码处理中的应用
  • Mybatis @Param参数传递说明
  • 【工作笔记】Wrappers.lambdaQuery()用法
  • RK3588在YOLO12(seg/pose/obb)推理任务中的加速方法
  • JS数组排序算法
  • 打靶日常-upload-labs(21关)