学习嵌入式第二十六天

文章目录

  • IO(续上)
    • 1.标准IO
      • 1.标准IO的接口
      • 2.流的定位
    • 2.文件IO
      • 1.概念:
      • 2.系统调用和库函数
      • 3.文件IO函数接口
  • 习题

IO(续上)

1.标准IO

1.标准IO的接口

  • fwrite

    原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    功能:向流中写入ptr指向的nmemb个对象,每个对象size个字节
    参数:ptr:指向数据空间的首地址size:写入的每个对象的大小nmemb:写入对象的个数stream:文件流指针
    返回值:成功返回实际写入对象的个数失败返回0
    
  • fread

    原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:从流中读取nmemb个对象到ptr指向的空间中,每个对象size字节
    参数:ptr:存放数据空间的首地址size:读取对象的字节大小nmemb:读取对象的个数stream:文件流指针
    返回值:成功返回读到对象的个数失败或者读到文件末尾返回0
    

2.流的定位

  • 作用:设置流的偏移量

  • 偏移量的设置:

    1. fseek

      原型:int fseek(FILE *stream,long offset,int whence);
      功能:设置流的偏移量的标识
      参数:stream:文件流指针offset:偏移量>0 向后偏移<0 向前偏移whence:标识SEEK_SET:文件开头SEEK_CUR:当前位置SEEK_END:文件末尾
      返回值:成功返回0失败返回-1
      
    2. ftell

      原型:long ftell(FILE *stream);
      功能:获得流的偏移量
      参数:stream:文件流指针
      返回值:成功返回流的偏移量
      
    3. rewind

      原型:void rewind(FILE *stream);
      功能:将流重新定位到开头
      

    练习1:从终端输入一个文件名,获得文件的长度

    #include<stdio.h>int main(void){FILE *fp = NULL;long len = 0;char filename[32] = {0};int cnt = 0;scanf("%s",filename);fp = fopen(filename,"r");if(NULL == fp){perror("fail to fopen");return -1;}fseek(fp,0,SEEK_END);len = ftell(fp);printf("len = %ld\n",len);return 0;
    }
    

    练习2:从bmp文件中读取图片的宽度和高度

    #include<stdio.h>int main(void){FILE *fp = NULL;int width = 0;int height = 0;fp = fopen("1.bmp","r");if(NULL == fp){perror("fail to fopen");return -1;}fseek(fp,18,SEEK_SET);fread(&width, 4, 1, fp);fread(&height, 4, 1, fp);printf("width = %d, height = %d\n", width, height);fclose(fp);return 0;}
    

2.文件IO

1.概念:

  • 标准IO是有缓存的IO,文件IO没有缓存,适合于通信,硬件设备操作
  • 标准IO是库函数,文件IO是系统调用

2.系统调用和库函数

  • 系统调用:是Linux内核中的代码,只能在Linux中使用
  • 库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统调用完成对应功能

3.文件IO函数接口

  1. 函数接口

    标准IO						    文件IO
    fopen							 open
    fclose							 close
    fgetc/fputc						 read/write
    fgets/fputs					 	 
    fscanf/fprintf					 
    fread/fwrite					 
    fseek/ftell/rewind				 lseek
    
  2. 文件打开

    原型:
    功能:打开文件获得操作文件的文件描述符
    参数:pathname:要打开的文件路径flags:打开文件的标志,必须包含三者之一O_RDONLYO_WRONLYO_RDWRO_CREAT		文件不存在创建O_TRUNC		文件存在截断为0O_APPEND	追加O_EXCL		文件存在报错
    返回值:成功返回新文件描述符失败返回-1
    
    • 有三个特殊的文件描述符:标准输入(0),标准输出(1),标准错误(2)
    • 文件描述符特点
      • 取未被占用的最小的非负整数
      • 文件描述符有上限,到达上限后再打开会报错误
  3. 关闭文件描述符

    原型:int close(int fd);
    功能:
    关闭文件描述符
    
  4. 标准IO对应文件IO的打开方式

标准IO文件IO
rO_RDONLY
r+O_RDWR
wO_WRONLY |O_CREAT |O_TRUNC , 0664
w+O_RDWR | O_CREAT | O_TRUNC , 0664
aO_WRONLY |O_APPEND | O_CREAT , 0664
a+O_RDWR | O_APPEND | O_CREAT , 0664
  1. 文件IO读写

    • write

      原型:ssize_t write(int fd, const void *buf, size_t count);
      功能:
      向文件描述符中写入buf指向的count个字节的数据
      参数:
      fd:文件描述符
      buf:要写入的数据空间首地址
      count:要写入的字节数
      返回值:
      成功返回实际写入的字节数
      失败返回-1
      

习题

1.利用fread和fwrite实现图片的拷贝

代码实现:

#include<stdio.h>int main(void){FILE *fp = NULL;FILE *fp1 = NULL;char filename[100];char filename1[100];char tmpbuff[4096] = {0};size_t nret = 0;printf("请输入源图片名:");scanf("%s",filename);fp = fopen(filename,"r");if(fp == NULL){perror("fail to fopen");return -1;}printf("请输入目标图片名:");scanf("%s",filename1);fp1 = fopen(filename1,"w");if(fp1 == NULL){perror("fail to fopen");return -1;}while(1){nret = fread(tmpbuff, 1, sizeof(tmpbuff), fp);if(nret == 0){break;}fwrite(tmpbuff,1,nret,fp1);}fclose(fp);fclose(fp1);return 0;
}

2.统计一个文件中出现最多字符是哪个,并显示出现了多少次

代码实现:

#include<stdio.h>
#include<stdlib.h>typedef struct linknode{char data;int count;struct linknode *next;
} node;int main(){FILE *fp = NULL;char filename[100] = {0};char ch;node *head = NULL;node *current = NULL;node *tmp = NULL;int max = 0;printf("请输入要扫描的文件:");scanf("%s", filename);fp = fopen(filename,"r");if(fp == NULL){printf("无法打开文件!\n");return 1;}while(1){ch = fgetc(fp);if(ch == EOF) {break;}current = head;while(current != NULL){if(current->data == ch){current->count++;break;}current = current->next;}if(current == NULL){tmp = malloc(sizeof(node));if(tmp == NULL){perror("fail to malloc");return -1;}tmp->data = ch;tmp->count = 1;tmp->next = head;head = tmp;}}current = head;while(current != NULL){if(current->count > max){max = current->count;tmp = current;}current = current->next;}printf("出现次数最多的字符为:%c\n出现了%d次\n",tmp->data,tmp->count);while(head != NULL){tmp = head;head = head->next;free(tmp);}fclose(fp);return 0;
}

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

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

相关文章

GDB 程序启动参数设置深度指南

GDB 程序启动参数设置深度指南 1. 概述 在程序调试过程中&#xff0c;正确设置启动参数对于验证程序行为、重现特定场景至关重要。GDB提供多种灵活的方式设置启动参数&#xff0c;特别是当您需要调试命令行参数处理逻辑或配置敏感型应用时。 2. 参数设置的核心方法 2.1 启动GDB…

Autudl华为昇腾系列NPU简介和部署推理yolo11 yolov8 yolov5分割模型

0.配置Autudl 下面图片是我所租的昇腾卡和具体环境版本&#xff0c;太具体的就不说了&#xff0c;有需要的话我单独出一期Autudl租显卡的教程&#xff0c;主要是为了学习昇腾环境如何运行Yolo系列模型。 0.1华为昇腾芯片&#xff08;Ascend&#xff09;简介 1.Ascend 310&…

什么是JSP和Servlet以及二者的关系

JSP&#xff08;JavaServer Pages&#xff09; 是“HTML 里写 Java”的模板技术&#xff0c;最终会被容器转换成 Servlet。Servlet 是“Java 里写 HTML”的 Java 类&#xff0c;直接继承 javax.servlet.http.HttpServlet&#xff0c;用来接收/响应 HTTP 请求。Servlet 是什么 纯…

【WonderTrader源码详解 1】【环境搭建 2】【编译安装WonderTrader】

一、引言 本篇来讲述如何搭建 wondertrader 和 wtpy 二、wondertrader 2.1 源码下载 # /home/leo/sda_1.6TBgit clone https://gitee.com/wondertrader/wondertrader.gitgit clone https://gitee.com/wondertrader/wtpy.git2.2 源码编译 cd /home/leo/sda_1.6TB/wondertrader/s…

hutool 作为http 客户端工具调用的一点点总结

场景一&#xff1a;客户端timeout 的时间给的很短//100毫秒 private static final int HTTP_TIMEOUT_MS 1 * 100; response HttpUtil.createPost(patrolresultconfirmUrl).body(JSONObject.toJSONString(search)).header("Authorization", token).timeout(HTTP_TI…

基于MongoDB/HBase的知识共享平台的设计与实现

标题:基于MongoDB/HBase的知识共享平台的设计与实现内容:1.摘要 在当今信息爆炸的时代&#xff0c;知识的有效共享和管理变得愈发重要。本研究的目的是设计并实现一个基于MongoDB/HBase的知识共享平台&#xff0c;以满足大规模知识数据的存储、高效查询和快速共享需求。方法上&…

PHP数组操作:交集、并集和差集

1. 交集&#xff08;Intersection&#xff09;交集是指两个集合中都存在的元素。$array1 [1, 2, 3, 4]; $array2 [3, 4, 5, 6];$intersection array_intersect($array1, $array2); print_r($intersection); // 输出: Array ( [2] > 3 [3] > 4 )2. 并集&#xff08;Uni…

Qt 常用控件 - 7

Text Edit&#xff08;多行输入框&#xff09;QTextEdit 表示多行输入框&#xff0c;也是一个富文本 & markdown 编辑器&#xff0c;能在内容超出范围时自动提供滚动条。QTextEdit&#xff1a;不仅仅能表示纯文本&#xff0c;还可以表示 htnl 和 markdownQPlainTextEdit&am…

JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目

目录一、JDK的安装1. 安装JDK2. 配置环境变量3. 检查jdk是否已安装二、eclipse的安装1. 解压安装2. 设置字体大小3. 设置拼写提示三、tomcat安装四、创建项目1. 第一次创建一个普通的java项目2. 第一次创建一个java web项目扩展&#xff1a;运行项目报Tomcat端口占用&#xff0…

Iptables 详细使用指南

目录 1. 工作原理​ 2. 核心架构&#xff08;四表五链&#xff09; 2.1 四张表&#xff08;优先级从高到低&#xff09; 2.2 五条内置链&#xff08;数据包流向&#xff09; 3. Iptables规则 3.1 规则的匹配条件与目标动作 常见匹配条件&#xff08;用于筛选数据包&…

Vue 服务端渲染(SSR)详解

Vue SSR是一种在服务端将 Vue 应用渲染成 HTML 字符串&#xff0c;然后直接发送到客户端的技术。相比传统的客户端渲染&#xff0c;Vue SSR 能带来更好的 SEO 性能和更快的首屏加载时间。下面我们从零到一&#xff0c;结合项目源码&#xff0c;详细讲解如何实现一个 Vue SSR 项…

机器翻译:需要了解的数学基础详解

文章目录一、概率论与统计学1.1 基本概念1.2 在机器翻译中的应用二、线性代数2.1 基本概念2.2 在机器翻译中的应用三、微积分3.1 基本概念3.2 在机器翻译中的应用四、信息论4.1 基本概念4.2 在机器翻译中的应用五、数值优化5.1 优化问题形式化5.2 优化算法5.3 正则化技术六、图…

蓝桥杯手算题和杂题简易做法

一、巧用Excel Excel在解决某些数学问题时非常高效&#xff0c;特别是涉及表格计算、简单统计和可视化分析时。 门牌制作 这道题是一道基础题&#xff0c;只需要判断每个数字有几个2&#xff0c;然后在加起来即可&#xff0c;但是还有更简单的方法&#xff0c;先通过编译器&…

5. 缓存-Redis

文章目录前言一、 介绍1. 简介2. 核心特点二、 应用场景1. 应用场景2. 数据类型作用场景三、 性能特性1. 内存2. 高性能数据结构3. 单线程、多路复用四、 异步持久化机制1. RDB&#xff08;Redis Database&#xff09;2. AOF&#xff08;Append-Only File&#xff09;3. 持久化…

如何理解Tomcat、Servlet、Catanalina的关系

目录 背景&#xff1a; 结论&#xff1a; 好文-【拓展阅读】&#xff1a; 象漂亮更新动力&#xff01; 背景&#xff1a; 学习Java的Servlet时&#xff0c;常常说Tomcat是一个容器&#xff0c;我们写ServletA,ServletB,Tomcat容器在启动的时候会读取web.xml或者我们程序中的…

Hive的并行度的优化

对于分布式任务来说&#xff0c;任务执行的并行度十分重要。Hive的底层是MapReduce&#xff0c;所以Hive的并行度优化分为Map端优化和Reduce端优化。(1)、Map端优化Map端的并行度与Map切片数量相关&#xff0c;并行度等于切片数量。一般情况下不用去设置Map端的并行度。以下特殊…

Vue.js 响应接口:深度解析与实践指南

Vue.js 响应接口&#xff1a;深度解析与实践指南 引言 随着前端技术的不断发展&#xff0c;Vue.js 作为一种流行的前端框架&#xff0c;已经成为了众多开发者的首选。Vue.js 的响应式系统是其核心特性之一&#xff0c;它允许开发者轻松实现数据的双向绑定。而响应接口则是Vue.j…

高精度蓝牙定位:技术、应用与未来发展

一、高精度蓝牙定位概述在当今科技飞速发展的时代&#xff0c;定位技术的精度和可靠性变得越来越重要。高精度蓝牙定位作为一种新兴的定位技术&#xff0c;正逐渐崭露头角。蓝牙技术是一种支持设备短距离通信&#xff08;一般10m内&#xff09;的无线电技术&#xff0c;能在包括…

C# 基于halcon的视觉工作流-章29-边缘提取-亚像素

C# 基于halcon的视觉工作流-章29-边缘提取-亚像素 本章目标&#xff1a; 一、1edges_sub_pix&#xff1b; 二、threshold_sub_pix&#xff1b;本实例实现过程与章28基本相同&#xff0c;不同处在于提取的边缘是亚像素&#xff0c;精度较高&#xff0c;本文仅介绍不同之处&#…

如何实现PostgreSQL的高可用性,包括主流的复制方案、负载均衡方法以及故障转移流程?

前言 实现 PostgreSQL 的高可用性&#xff08;High Availability, HA&#xff09;是一个系统工程&#xff0c;需要结合复制技术、连接路由&#xff08;负载均衡&#xff09;、自动故障转移&#xff08;Failover&#xff09;以及监控告警。以下是主流方案和关键流程的详细说明&a…