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

嵌入式系统学习Day17(文件编程)

 1.流 是什么 ? 
流 是 内存 和 硬盘直接 形成一个 数据通道 
2.FILE * 
流指针 
关联到这个流上 
代表这个流 
3.fopen的作用 
相当于 将 硬件上的文件 转换为 了 内存的的流指针 
流指针 
描述的是文件操作的这个动态的对象 
4.errno 是系统设计错误码 的全局变量 
errno = 2

perror("想要输出的字符串");
输出效果:
想要输出的字符串:错误原因



//2.读写 
fgetc/fputc //单个字符读写 


int fgetc(FILE *stream);
功能:
从stream中读取字符 
参数:
@stream  要读取的文件流指针 
返回值:
成功 读取到的字符的ASCII码值 
失败 EOF 
注意:  
文件结尾也是EOF


系统中,默认打开了三个文件,直接可以用 
标准输入 --- stdin   --- 关联到键盘 
标准输出 --- stdout  --- 关联到屏幕
标准出错 --- stderr  --- 关联到屏幕 

getchar() <=> fgetc(stdin);    

    fputc 
int fputc(int c, FILE *stream);
功能:
将字符 c 写到 stream中
参数:
@c      就是要写的字符 
@stream 要操作的文件 
返回值:
成功 返回被写入的字符 
失败 EOF       




关闭:
fclose()
int fclose(FILE *stream);
功能:
关闭流指针,并且刷新流中的数据到指定位置 
// 关闭底层的文件描述符 
返回值:
成功 0
失败 EOF









图片 --- 二进制文件 
01000101 0 --->硬盘 
文本文件 
"hello" --ASCII--->编码格式 存放到计算机 
0
1000 0000 


windows系统下 ---实现文件操作是 需要 区分文本文件 和 二进制文件 
linux下 操作时 不区分 


windows 
12345\r\n
1310       
11011010
linux
12345\n


fgets/fputs 

fgets //gets --- gets 编译器不推荐用,推荐使用fgets  


char *fgets(char *s, int size, FILE *stream);     
功能:
从stream 中读取一个字符串 
将字符串,保存到s指定的size大小一块空间
参数:
@s  表示存储读取结果的 一块字符空间 
@size  表示一次读取多少个字节 
@stream 就是要读取的文件 
返回值:
成功 返回 s
失败 NULL 
注: 
1. 读到文件结尾也返回NULL     
出错也是NULL 
【问题】 --- 那么如果返回值为NULL  
到底是出错了,还是到达文件结尾了?
2. fgets 读取结束 
(1) EOF会结束    //读到文件结尾  --- EOF并不存在文件中,只是到达结尾时的标志 
(2) 遇到'\n'     // '\n' 会被 读取到最终的 buffer中
(3) 读满size-1个 
3.fgets 会自己在 buffer中最后一个字符的后面 加 '\0' --- 处理成字符串 
4.fgets 比 gets 更安全
可以指定读取多少个字节的数据 
fgets 更推荐使用 

fputs
int fputs(const char *s, FILE *stream);
功能:
将s中的字符串,输出到 stream对应文件中 
参数:
@s       要输出的字符串的地址 
@stream  要输出到的文件 
返回值:
成功 非负值
失败 EOF  

注意:
fputs 不会自动输出一个 '\n'
puts //自动会输出一个 '\n'
fputs输出结束的条件 ---是遇到 '\0'






拷贝普通文件 
拷贝二进制文件 //图片 试试 

注意:
fgets 和 fputs 实现拷贝文件 
对于二进制文件 --问题很大
二进制文件中 存储大量的 '\0'
fgets读取没有问题
但是fputs是要输出字符串 
而字符串遇到 '\0' 就结束 

fread/fwrite //按对象读写 
//二进制读写函数 

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从指定的文件中stream读取nmemb个元素,每个元素size大小的 这么多个数据,
存放到ptr指定的一块空间 
参数:
@ptr 存储数据的空间的首地址 
@size 单个元素的大小 
@nmemb 多少个元素 
@stream 要读取的流指针 
返回值:
成功 返回读取到的对象个数
失败 0 
到达结尾返回0
用途:
用来处理 文件中 操作对象 固定单一这种 
结构体:


---------------------------------------------------------------------
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
将ptr所在空间的额 nmemb个大小为size的元素,写到stream对应的文件中    
参数:
@ptr   存储数据的空间的首地址 
@size  单个元素的大小 
@nmemb 多少个元素 
@stream 要写的的流指针 
返回值:
成功 返回写入的对象个数
失败 0 

注:
fread 和 fwrite配合用时 
int ret = fread(buf,sizeof(int),10,fp);
fwrite(buf,sizeof(int),ret,stdout); //成功读取多少个就输出多少个 


------------------------------------
操作文件:
1.打开 
fopen
2.读写
fgetc/fputc
fgets/fputs
fread/fwrite
3.关闭 
fclose 

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

相关文章:

  • 项目实战2——LAMP_LNMP实践
  • 智能化评估体系:数据生产、在线化与自动化的三重奏
  • 解锁 Appium Inspector:移动端 UI 自动化定位的利器
  • 【论文阅读】一种基于经典机器学习的肌电下肢意图检测方法,用于人机交互系统
  • Secure CRT做代理转发
  • 【element树组件】el-tree实现连接线及hover编辑效果
  • ip归属地批量查询脚本
  • 视频输入输出模块介绍和示例
  • 【Node.js从 0 到 1:入门实战与项目驱动】2.1 安装 Node.js 与 npm(Windows/macOS/Linux 系统的安装步骤)
  • history命令增强记录执行时间与登录IP
  • 线性代数 · 矩阵 | 最小多项式
  • 【debug 解决 记录】stm32 debug模式的时候可以运行,但是烧录没法执行
  • Mac如何安装telnet命令
  • 论答题pk小程序软件版权的
  • 家政小程序系统开发:推动家政行业数字化转型,共创美好未来
  • 校园快递小程序(腾讯地图API、二维码识别、Echarts图形化分析)
  • 基于开源AI大模型AI智能名片S2B2C商城小程序的母婴用品精准营销策略研究
  • 思科、华为、华三如何切换三层端口?
  • Web前端小游戏轮盘。
  • 盲盒抽谷机小程序系统开发:解锁盲盒新玩法,开启潮玩社交新时代
  • OpenHarmony介绍
  • 计算机网络---默认网关(Default Gateway)
  • 飞算JavaAI全流程实操指南:从需求到部署的智能开发体验
  • 本地(macOS)和服务器时间不同步导致的 Bug排查及解决
  • web应用服务器——Tomcat
  • Linux 常用命令大全:覆盖日常 99% 操作需求
  • A4.1:继C5.3引申的基极偏置的应用和发射极偏置的负反馈电阻讨论
  • STM32——GPIO
  • 嵌入式Linux进程管理面试题大全(含详细解析)
  • 嵌入式硬件——ARM