嵌入式学习-IO进程-Day02

嵌入式学习-IO进程-Day02

标准IO函数接口

fread,fwrite

文件指针偏移函数

文件IO

概念

文件IO的特点

文件描述符

文件IO的函数接口

open 打开文件

close 关闭文件

read 读函数

write 写函数

lseek 移动文件指针

标准IO和文件IO对比

目录操作函数

opendir 打开目录

closedir关闭目录流

readdir读取目录中的内容

chdir修改当前所处路径

标准IO函数接口

fread,fwrite

 #include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以指定类型从文件中读取内容
参数: ptr:读内容存放的首地址
       size:读一个元素内容的字节大小
       nmemb:读元素的个数
       stream:(文件)
返回值:成功:元素个数,读到文件结尾0.
     失败:-1size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
功能:以指定类型向文件中写内容
参数:
   ptr:写内容存放的首地址
    size:写一个元素内容的字节大小
    nmemb:写元素的个数
    stream:(文件)
返回值:成功:写元素个数.
     失败:-1

示例代码:将一个int类型的数组写到文件中保存起来,并且读出来

文件指针偏移函数

rewind
	     void rewind(FILE *stream);
         功能:将文件指针定位到文件开头ftell
	    long ftell(FILE *stream);
		功能:计算文件指针当前的位置(相对于文件开头)
		返回值:成功:文件指针的位置
		        失败:-1,更新errno
fseek
       	int fseek(FILE *stream, long offset, int whence);
		功能:将文件指针偏移到指定位置
		参数:
		    stream:流指针
			offset:偏移量   +5 --》相对于位置向后偏移5byte
			                 -5 --》相对于位置向前偏移5byte
			whence:相对位置
			   SEEK_SET:开头
			   SEEK_CUR:当前
			   SEEK_END:结尾
		返回值:成功:0
		    失败:-1,更新errno
用法:
fseek(fp,+5,SEEK_SET

文件IO

概念

内核向上提供的输出输出函数接口,叫做系统调用函数接口。基于内核,内核不同,系统调用函数接口不同,文件IO不同操作系统函数接口不通用。可移植性较差。

文件IO的特点

  1. 没有缓存机制,每次调用都会引起系统调用。
  2. 围绕文件描述符进行操作,文件描述符都是非负的整数,依次进行分配。
  3. 文件IO默认打开三个文件描述符,0(标准输入),1(标准输出),2(标准错误)
  4. 可以操作除了目录文件外的任意类型的文件。

文件描述符

文件描述符都是非负的整数,取值范围(0-1023),最多产生1024个文件描述符,文件描述符被分配的时候是连续的。关闭文件描述符之后才可以提供给其他文件使用。

文件IO的函数接口

open 打开文件

int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
      flags:打开文件的方式
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:可读可写
            O_CREAT:创建
            O_TRUNC:清 空
            O_APPEND:追加   
返回值:成功:文件描述符
        失败:-1
r:O_RDONLY
r+O_RDWR
w: O_WRONLY | O_CREAT | O_TRUNC0666
w+O_RDWR | O_CREAT | O_TRUNC ,0666
a: O_WRONLY | O_APPEND |  O_CREAT0666
a+O_RDWR | O_APPEND |  O_CREAT0666

当文件的打开方式里有O_CREAT创建时,需要函数
int open(const char *pathname, int flags, mode_t mode);
mode:创建文件的权限,只有打开方式当中包含O_CREAT才填充
创建的文件实际的权限位mode & ~umaskumask是权限掩码,值为0002mode 0666,创建文件的实际权限 0664
umask权限掩码修改命令:umask 0000
修改权限掩码让mode与输入的权限保持一致

close 关闭文件

 #include <unistd.h>
 int close(int fd);
 功能:关闭文件

read 读函数

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:读文件
参数:fd:文件描述符
      buf:存放内容的首地址
      count:期待读取字符的个数
返回值:成功实际读到字符的个数,读到文件结尾返回0
        失败返回-1,更新errno使用read函数时需要注意:read读文件,一般期待读多少字符就是读多少,不会自动补’\0‘,遇到\n也不会自动停止读取,会继续读下一行的内容。
'\0'需要自己补充,考虑预留一个字节补'\0'使用技巧:
1.通过返回值作为实际读到的字符个数,后面补‘\0’;
        char buf[32];
        ret = read(fd,buf,31);
        buf[ret] = '\0';
2.每次读内容放到数组之前先清空数组。
清空数组的函数:memset bzero
memset:
#include <string.h>
void *memset(void *s, int c, size_t n);
功能:清空数组
参数:void *s:数组的首地址
   int c :一般写0size_t n:清空的字节数bzero:
#include <strings.h>
void bzero(void *s, size_t n);
功能:清空数组
参数:void *s:数组的首地址
    size_t n:清空的字节数

write 写函数

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:写文件
参数:
    fd:文件描述符
    buf:写内容存放的首地址
    count:期待写字符的个数
返回值:成功实际写字符的个数
    失败返回-1,更新errno用法:
ret = read(fd,buf,sizeof(buf));
write(fd,buf,ret)

练习:利用read和write函数实现cp功能。

lseek 移动文件指针

#include <sys/types.h>
#include <unistd.h>
       off_t lseek(int fd, off_t offset, int whence);
	   功能:将文件指针移动到指定位置
	   参数:
	       fd:文件描述符
		   offset:偏移量  +向后 -向前
		   whence:相对位置
		       SEEK_SET:开头
			   SEEK_CUR:当前
			   SEEK_END:结尾
	返回值:成功:当前位置(基于文件开头)
	        失败:-1,更新errno用法:
定位到开头
lseek(fd,0SEEK_SET)

标准IO和文件IO对比

标准IO

文件IO

概念

c库中定义的一组用于输入输出的函数接口

系统中定义的一组用于输入输出的函数接口

特点

  1. 标准IO是C库中提供的一组专门用于输入输出的函数接口
  2. 标准IO不仅在Unix系统上,在很多操作系统上都实现了标准IO。
  3. 标准I/O通过缓冲机制减少系统调用,提高效率
  4. 标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE *来描述。
  5. 标准IO默认打开三个流:标准输入(stdin),标准输出(stdout),标准出错(stderr)。

  1. 没有缓存机制,每次调用都会引起系统调用。
  2. 围绕文件描述符进行操作,文件描述符都是非负的整数,依次进行分配。
  3. 文件IO默认打开三个文件描述符,0(标准输入),1(标准输出),2(标准错误)
  4. 可以操作除了目录文件外的任意类型的文件。

函数:

打开文件:fopen

关闭文件:fclose

读写操作:fgetc fputc fputs fgets fread fwrite

定位操作:fseek rewind ftell

时间:time localtime

其他:fflush fprintf perror

打开文件:open

关闭文件:close

读写操作:read write

定位操作:lseek

目录操作函数

opendir 打开目录

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
功能:打开目录文件
参数:name:文件名
返回值:成功返回目录流指针
        失败返回NULL示例代码
DIR *dirp = opendir("./");
    if (dirp == NULL)
    {
        perror("opendir err\n");
        return -1;
    }

closedir关闭目录流

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
功能:关闭目录
   参数:dirp:目录流指针
   返回值:成功0,失败-1,更新errno

readdir读取目录中的内容

#include <dirent.h>
struct dirent *readdir(DIR *dirp);
功能:读取目录中的内容
参数:dirp:目录流指针
返回值:成功返回结构体指针,读到结尾返回NULL
    失败返回NULL更新errnostruct dirent {
           ino_t      d_ino;       /* 文件的inode号 */
           off_t      d_off;       /* Not an offset; see below */
       unsigned short d_reclen;    /* Length of this record */
unsigned char  d_type;      /* 文件类型,但不是所有的都支持                                          
       char           d_name[256]; /*文件名 */
           };

练习:实现ls功能

chdir修改当前所处路径

#include <unistd.h>
 int chdir(const char *path);功能:修改文件路径参数:修改改的路径返回值:成功返回0        失败返回-1更新错误码

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

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

相关文章

库卡ForceTorqueControl(一)

1. 功能说明 ForceTorqueControl 是一个可后载入的备选软件包&#xff0c;具有下列功能&#xff1a; 执行取决于测得的过程力和力矩的运动 遵守过程力和力矩&#xff0c;不取决于工件的位置和尺寸 遵守加工工件期间复杂的过程力变化 沿着根据测得的过程力编程的轨迹调整速度 通…

【高分论文密码】AI赋能大尺度空间模拟与不确定性分析及数字制图

随着AI大语言模型的广泛应用&#xff0c;大尺度空间模拟预测与数字制图技术在不确定性分析中的重要性日益凸显。这些技术已经成为撰写高分SCI论文的关键工具&#xff0c;被誉为“高分论文密码”。大尺度模拟技术能够从不同的时空尺度揭示农业生态环境领域的内在机理和时空变化规…

JAVA开源项目 课程智能组卷系统 计算机毕业设计

本文项目编号 T 009 &#xff0c;文末自助获取源码 \color{red}{T009&#xff0c;文末自助获取源码} T009&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 老…

【JAVA毕业设计】基于Vue和SpringBoot的医院电子病历管理系统

本文项目编号 T 008 &#xff0c;文末自助获取源码 \color{red}{T008&#xff0c;文末自助获取源码} T008&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 医…

python自动化办公实例(使用openpyxl、os处理统计Excel表中的数据并将其合并)

源数据格式 以其中一个表格为例 可以看到表中数据比较杂乱且并没有我们想要的数据、指标&#xff08;如一等奖、二等奖的数量&#xff09;不利于下一步数据的分析。所以我们需要手动对数据进行一些处理&#xff0c;大致格式如下&#xff1a; 数据处理格式 这里的手动处理可以…

基础算法(6)——模拟

1. 替换所有的问号 题目描述&#xff1a; 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;尝试用 a ~ z 的每一个字符替换即可 注意点&#xff1a;需考虑数组开头和结尾是问号的边界情况 代码实现&#xff1a; class Solution {public …

《深度学习》OpenCV FisherFaces算法人脸识别 原理及案例解析

目录 一、FisherFaces算法 1、什么是FisherFaces算法 2、原理 3、特点 4、算法步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;LDA降维 4&#xff09;特征投影 5&#xff09;人脸识别 二、案例解析 1、完整代码 运行结果&#xff1a; 一、Fish…

【题解】【记忆化递归】——Function

【题解】【记忆化递归】——Function Function题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.思路解析2.AC代码 Function 通往洛谷的传送门 题目描述 对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c) 如果 a ≤ 0 a \le 0 a≤0 或 b ≤…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections&#xff1a;orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的&#xff0c;需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

项目分析:自然语言处理(语言情感分析)

在这个信息爆炸的时代&#xff0c;我们每天都在与海量的文本数据打交道。从社交媒体上的帖子、在线评论到新闻报道&#xff0c;文本信息无处不在。然而&#xff0c;这些文本不仅仅是文字的堆砌&#xff0c;它们背后蕴含着丰富的情感和观点。如何有效地理解和分析这些情感&#…

Linux下的防病毒软件(Antivirus software for Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

docker环境安装mongoDB实现平滑迁移实战

docker环境安装mongoDB实现平滑迁移实战 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09;二、数据迁移三、迁移过程日志打印四、验证迁移数据准确性 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09; 使用mongodump工具对原始mo…

Java发送请求实现QPS限制

业务场景 在开发中&#xff0c;当有业务需求需要调用第三方服务实现功能&#xff0c;但是服务接口有QPS限制&#xff0c;所以我们需要在发送请求时限制发送频率防止请求失败。 实现方法 使用 Java Semaphore 类来实现控制请求QPS QPS限制 Component public class QPSControll…

MySQL 8.4修改user的host属性值

MySQL 8.4修改user的host属性值 update mysql.user set host localhost where user mysql用户名; MySQL 8.4修改初始化后的默认密码-CSDN博客文章浏览阅读804次&#xff0c;点赞6次&#xff0c;收藏11次。先下载mysql的zip压缩包&#xff1a;MySQL :: Download MySQL Communi…

STL-string

STL的六大组件&#xff1a; string // string constructor #include <iostream> #include <string> using namespace std; int main() {// 构造std::string s0("Initial string");std::string s1; //nullptrstd::string s2("A character sequenc…

【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录 1 -> Jsoncpp 1.1 -> 特性 1.2 -> 安装 2 -> 序列化 3 -> 反序列化 4 -> Json::Value 1 -> Jsoncpp Jsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的&#xf…

RHCSA复习题

第一~七章 1.创建以下目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下。 [rootlocalhost ~]# mkdir /yasuo [rootlocalhost ~]# mkdir /yasuo/dir1 [rootlocalhost ~]# cd /yasuo/dir1 [rootlocalhost dir1]# touch hostname hostname02 passwd ssh_config sshd [r…

F5-TTS开源项目详解:非自回归语音合成技术革新与应用场景

在现代科技的推动下&#xff0c;语音合成技术取得了长足的进步。随着越来越多的场景开始依赖语音交互&#xff0c;如何高效、自然地生成语音成为了行业的一个重要课题。今天我们要讨论的是一个在语音合成领域备受瞩目的开源项目——F5-TTS。它不仅采用了非自回归架构&#xff0…

Arduino配置ESP32环境

Arduino配置ESP32环境 引言一、IDE下载教程操作取巧方法 二、社区安装包三、官方手动安装 引言 最近入手了一款ESP32-C3的开发板&#xff0c;想继续沿用现有Arduino IDE&#xff0c;网上看了很多方法&#xff0c;大致分了三类&#xff1a;IDE下载、社区安装包、github手动配置…