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

学习嵌入式第二十五天

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.dtcms.com/a/325179.html

相关文章:

  • 机器学习——K-means聚类
  • 个人效能是一个系统
  • 【YOLO11改进 - C3k2融合】C3k2融合EBlock(Encoder Block):低光增强编码器块,利用傅里叶信息增强图像的低光条件
  • 学习嵌入式的第十六天——C语言——位运算
  • tlias智能学习辅助系统--原理篇-SpringBoot原理-自动配置-自定义starter
  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • #Datawhale AI夏令营#第三期全球AI攻防挑战赛(AIGC技术-图像方向)
  • [Shell编程] Shell的正则表达式
  • P3232 [HNOI2013] 游走,solution
  • Python 程序设计讲义(68):Python 的文件操作——使用os模块操作文件
  • 整数规划-分支定界
  • Win10清理C盘步骤
  • 展锐平台(Android15)WLAN热点名称修改不生效问题分析
  • 最大子数组和-一维动态规划
  • C++ 黑马 引用
  • 一款轻量、免费、无广告,强大的演示工具,支持屏幕放大、涂鸦、截图、录屏
  • PostgreSQL因为A/B switch以及group表过多导致WAL full的情况讨论
  • 托福单词词组积累 2025-08-10
  • 大模型 MCP服务案例详细讲解
  • 线程池的核心线程数与最大线程数怎么设置
  • NVIDIA Jetson AGX Orin 全景解析——边缘计算的高性能选择
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DNS欺骗、DHCP饿死)
  • VGG改进(1):基于Global Attention模块的详解与实战
  • RL代码实践 02——策略迭代
  • ai生成完成后语音通知
  • Starlink卫星终端对星策略是终端自主执行的还是网管中心调度的?
  • 如何部署图床系统 完整教程
  • python魔法属性__module__与__class__介绍
  • 学习numpy详解
  • Shell脚本-其他变量定义