学习嵌入式第二十五天

IO

1.概念

  • IO指input/output
  • Linux中一切皆文件
  • IO的操作对象是文件

2.文件

  • 一段数据的集合

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

  • 分类

    • 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.普通文件类型

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

2.标准IO接口

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

3.文件的打开

函数接口
  1. fopen

    原型:FILE *fopen(const char *pathname, const char *mode);
    功能:打开pathname指向字符串对应的文件,并和他建立一个流
    参数:pathname:要打开的文件路径字符串mode:打开方式r	只读	文件存在只读打开,文件不存在报错r+	读写	文件存在读写打开,文件不存在报错w	只写	文件存在清0,文件不存在创建,只写打开w+	写读	文件存在清0,文件不存在创建,写读打开a	追加	文件存在追加,文件不存在创建,只写打开a+	追加读写	文件存在追加,文件不存在创建,写读打开
    返回值:成功返回FILE*指针失败返回NULL
    
  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
    
    • fputs不会多打印\n字符
    • puts会多打印一个\n字符
  6. fgets

    原型:char *fgets(char *s, int size, FILE *stream);
    功能:从流中最多读size个字节数据放入s指向的空间中,遇到\n读取截止
    参数:s:写入字符串的首地址size:最多存放元素的个数stream:文件流指针
    返回值:成功返回存放数据空间的首地址失败返回NULL读到文件末尾返回NULL
    
    • gets会去掉从终端接收的\n字符
    • fgets不会去掉,并在最后加\0
  7. fprintf

    原型:int fprintf(FILE *stream, const char *format, ...);
    功能:将格式化的字符串打印在流中
    参数:stream:文件流指针format:格式化的字符串...:参数
    返回值:成功返回打印字符的个数失败返回负数
    
  8. fscanf

    原型:int fscanf(FILE *stream, const char *format, ...);
    功能:从流中接收格式化的字符串
    参数:stream:文件流指针format:格式化的字符串...:参数
    返回值:成功返回匹配的输入控制符的个数失败返回EOF读到末尾返回EOF
    

练习1:

  1. 从终端接收一个文件名,在终端打印出他的行数

    #include<stdio.h>
    #include<string.h>
    #include<error.h>int get_line(char *pfile){int cnt = 1;FILE *fp = fopen(pfile,"r");char ch = 0;fp = fopen(pfile,"r");if(fp == NULL){perror("fail to fopen");return -1;}while(1){ch = fgetc(fp);if(ch == '\n'){cnt++;}if(EOF == ch){break;}}fclose(fp);return cnt;
    }int main(void){char filepath[256] = {0};int line = 0;printf("请输入文件名:");   gets(filepath);line = get_line(filepath);printf("有%d行\n",line);return 0;
    }
    
  2. 将一个文件的内容拷贝到另一个文件中

    #include<stdio.h>
    #include<string.h>
    #include<error.h>int main(void){char filename[100] = {0};char filename2[100] = {0};FILE* fp = NULL;FILE*fp2 = NULL;char ch = 0;printf("输入源文件名:");gets(filename);fp = fopen(filename,"r");if(fp == NULL){perror("fail to open");return -1;}printf("输入新文件名:");gets(filename2);fp2 = fopen(filename2,"w");if(fp2 == NULL){perror("fail to open");return -1;}while(1){ch = fgetc(fp);if(EOF == ch){break;}fputc(ch,fp2);}fclose(fp);fclose(fp2);return 0;}
    

已经打开的三个特殊的流

  • stdin:标准输入流

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

  • stdout:标准输出流

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

  • stderr:标准出错流

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

4.标准IO的缓存

  • 效率高,实时性差
1.缓存类型
  • 全缓存

    缓存区满刷新缓存

    刷新条件:

    • 缓存区满4k刷新

    • fflush函数强制刷新

    • fclose或者程序关闭刷新

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

  • 行缓存

    遇到\n刷新缓存区

    刷新条件:

    • 缓存区满1k刷新
    • fflush函数强制刷新
    • fclose或者程序关闭刷新
    • 遇到\n刷新

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

  • 不缓存

    立即刷新不缓存

    刷新条件:

    • 不缓存立即刷新

    出错处理或者人机交互一般使用不缓存

习题

1.利用fgets和fputs实现文件内容的拷贝

代码实现:

#include<stdio.h>
#include<string.h>void copyfile(char *src,char *dst){FILE *srcfile = NULL;FILE *dstfile = NULL;char ch[1024] = {0};srcfile = fopen(src,"r");if(srcfile == NULL){printf("打开源文件失败!\n");return;}dstfile = fopen(dst,"w");if(dstfile == NULL){printf("打开目标文件失败!\n");fclose(srcfile);return;}while(fgets(ch,sizeof(ch),srcfile) != NULL){fputs(ch,dstfile);}fclose(srcfile);fclose(dstfile);return;
}int main(void){char srcfile[100] = {0};char dstfile[100] = {0};printf("请输入源文件:");fgets(srcfile,sizeof(srcfile),stdin);srcfile[strlen(srcfile) - 1] = 0;printf("请输入目标文件:");fgets(dstfile,sizeof(dstfile),stdin);dstfile[strlen(dstfile) - 1] = 0;copyfile(srcfile,dstfile);return 0;
}

2.从终端接受数字,将数字存放在文件中,程序实时显示当前所有数字的平均数,如果程序关闭再次启动时能够显示之前用户输入的所有数字的平均值

代码实现:

#include<stdio.h>int main(void){FILE *fp = NULL;int sum = 0;int num = 0;int count = 0;float average = 0;fp = fopen("number.txt","a+");if(fp == NULL){perror("fail to fopen");return -1;}while(fscanf(fp,"%d",&num) == 1){sum += num;count++;}while(1){fprintf(stdout,"请输入一个数字:");fscanf(stdin,"%d",&num);if(num < 0) {fprintf(stdout, "输入结束,程序退出。\n");break;}fprintf(fp,"%d\n",num);sum += num;count++;average = (float)sum / count;fprintf(stdout,"%f\n",average);}fclose(fp);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918417.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地部署接入 whisper + ollama qwen3:14b 总结字幕

1. 实现功能 M4-1 接入 whisper ollama qwen3:14b 总结字幕 自动下载视频元数据如果有字幕&#xff0c;只下载字幕使用 ollama 的 qwen3:14b 对字幕内容进行总结 2.运行效果 &#x1f50d; 正在提取视频元数据… &#x1f4dd; 正在下载所有可用字幕… [youtube] Extracting U…

【13-向量化-高效计算】

研究者能够扩展神经网络并构建非常大型网络的原因之一&#xff0c;就是神经网络可以被向量化&#xff0c;vectorized&#xff1b;可以非常高效地用矩阵地乘法实现。 事实上&#xff0c;并行计算硬件&#xff0c;例如GPU&#xff0c;一些CPU的功能&#xff0c;非常擅长进行非常大…

论文中PDF的公式如何提取-公式提取

Mathcheap - An AI-powered, free alternative to Mathpix Snip. 从PDF中截图公式&#xff0c;之后 ctrl V 转换成功 &#xff0c;提取成功 复制到word中&#xff0c;是这样的 这显然不是我们需要的。 可以使用Axmath 复制进去Axmath 就能正常显示公式。 之后再插入word…

用 Flink SQL 和 Paimon 打造实时数仓:深度解析与实践指南

1. 实时数仓的魅力&#xff1a;从离线到分钟级的飞跃实时数仓&#xff0c;听起来是不是有点高大上&#xff1f;其实它没那么神秘&#xff0c;但确实能让你的数据处理能力像坐上火箭一样飙升&#xff01;传统的离线数仓&#xff0c;像 Hadoop 生态的 Hive&#xff0c;动辄小时级…

【已解决】报错:WARNING: pip is configured with locations that require TLS/SSL

一、问题背景二、问题分析1. SSL模块缺失的本质2. Anaconda环境特点三、问题表现四、解决方案详解1. 完整配置环境变量2. 添加环境变量的步骤3. 测试验证五、实战示例六、附加建议七、总结八、参考链接一、问题背景 在Windows 10系统中使用Python的包管理工具pip时&#xff0c…

Java项目基本流程(三)

一、页面初始化阶段&#xff08;加载即执行&#xff09;加载栏目列表&#xff08;同步请求&#xff09;发送同步 AJAX 请求到SearchChannel接口&#xff0c;获取所有栏目数据。清空下拉框&#xff08;.channelid&#xff09;后&#xff0c;先添加 “全部” 选项&#xff0c;再循…

鹧鸪云光伏仿真:项目前期决策的“数据明灯”

曾有一处光伏项目&#xff0c;在精心筹备数月后终于建成&#xff0c;却在运行初期即因未充分评估山体遮挡影响&#xff0c;导致实际发电量较预期大幅降低近一成。前期决策中的微小疏漏&#xff0c;往往成为项目经济性与可行性的致命伤。而鹧鸪云光伏仿真软件正是一盏照亮前路的…

开发指南129-基础类-BaseController

所有接口都需要继承BaseControllerBaseController里有很多有用的方法&#xff0c;现举例最重要的几个&#xff1a;1、getURI返回接口地址&#xff0c;就是PostMapping或GetMapping中定义的接口地址。常用于返回值中&#xff0c;例如接口的异常处理&#xff1a;try {// 处理逻辑…

C++高频知识点(十八)

文章目录86. C多线程中&#xff0c;锁的实现方式有哪些&#xff1f;1. 互斥锁&#xff08;Mutex&#xff09;2. 递归互斥锁&#xff08;Recursive Mutex&#xff09;3. 读写锁&#xff08;Shared Mutex&#xff09;4. 自旋锁&#xff08;Spinlock&#xff09;5. 条件变量&#…

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day1

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

【软考中级网络工程师】知识点之 TCP 协议深度剖析

目录一、TCP 协议简介二、TCP 协议的特点2.1 面向连接2.2 可靠性高2.3 拥塞控制2.4 全双工通信2.5 高效性2.6 支持多种应用协议2.7 可靠的错误恢复三、TCP 协议的工作机制3.1 三次握手建立连接3.2 数据传输3.3 四次挥手关闭连接四、TCP 协议的数据包格式五、TCP 协议在实际应用…

操作系统1.5:操作系统引导

目录 总览 什么是操作系统引导&#xff1f; 磁盘里边有哪些相关数据? 操作系统引导(开机过程&#xff09; 总览 什么是操作系统引导&#xff1f; 操作系统引导(boot)——开机的时候&#xff0c;怎么让操作系统运行起来? 磁盘里边有哪些相关数据? 一个刚买来的磁盘(硬…

[鹧鸪云]光伏AI设计平台解锁电站开发新范式

1.[鹧鸪云]平台概述[鹧鸪云]是由鹧鸪云&#xff08;徐州&#xff09;信息技术有限公司倾力打造的&#xff0c;可以媲美‌PVsyst的光伏AI设计平台。它为光伏项目不同阶段的开发提供了快速设计、卫星地图设计、无人机3D设计、Unity3D设计、专业绘图设计与场区设计多种设计方式&am…

docker compose和docker-compose命令的区别

Docker Compose 有两种命令形式&#xff1a;docker compose&#xff08;空格连接&#xff09;docker-compose&#xff08;短横线连接&#xff09;其核心区别如下&#xff1a;一、技术特性docker-compose&#xff08;短横线&#xff09;独立可执行文件&#xff1a;作为独立程序安…

基于Strands Agent开发辅助阅读Agent

序 本篇由来&#xff0c;在COC上我当面感谢了组委会和姜宁老师&#xff0c;随即被姜宁老师催稿&#xff0c;本来当天晚上写了一个流水账&#xff0c;感觉甚为不妥。于是决定慢慢写&#xff0c;缓缓道来。要同时兼顾Show me the code&#xff0c;Show me the vide。希望能形成一…

20250807简单树上问题

引入 树是一种特殊的图&#xff0c;因其看起来像一颗倒挂的树而得名。 树有许多等价的形式化定义&#xff0c;我们这里只取一个&#xff1a;nnn个点n−1n-1n−1条边的无向连通图。 树的直径 定义树上任意两点之间最长的简单路径为树的直径。 一棵树可能有很多直径&#xff0c…

诺基亚就4G/5G相关专利起诉吉利对中国汽车及蜂窝模组企业的影响

诺基亚于2025年7月18日向欧洲统一专利法院&#xff08;UPC&#xff09;曼海姆分庭和德国慕尼黑法院提起诉讼&#xff0c;控诉中国吉利控股集团及其极氪、领克、路特斯、Smart等关联品牌在未经许可的情况下使用诺基亚4项蜂窝通信标准必要专利 。涉案专利包括1项覆盖4G/5G的标准必…

Kotlin反射详解

反射是一种机制&#xff0c;它允许我们在运行时检查、修改和操作类或对象的内部结构。反射开启了动态编程的可能性&#xff0c;在开发库、框架或工具等场景中非常有用。Java 中的反射 在 Java 中&#xff0c;反射一直是实现动态编程的重要基石。它允许开发者在不提前知道类名的…

学习嵌入式-IMX6ULL学习——中断

volatile&#xff1a;易变的&#xff0c;防止系统优化对寄存器做处理的时候使用&#xff0c;在进行写1清零操作时&#xff0c;防止该操作被系统优化&#xff1b;一、GIC通用中断控制器1.GIC通用中断控制器GIC接收众多外部中断&#xff0c;然后对其进行处理&#xff0c;最终通过…

HENGSHI SENSE 6.0 功能-AI 查数助手

面向所有AI Agent开放BI和数据分析能力 AI 查数助手 6.0版本中&#xff0c;我们AI助手的优化是比较深入且全面的。从问答效率到集成能力&#xff0c;都得到了大的跃升&#xff0c;是智能问数应用场景的重大升级以及体验的全方位优化。我们优化了 AI 助手执行流程&#xff0c;…