【Linux】系统文件接口

news2024/11/18 19:52:07

目录

一、C文件接口

1、fopen

2、fprintf

3、snprintf

二、系统文件IO

1、open

2、write

3、read

4、C文件接口与系统文件IO的关系


一、C文件接口

1、fopen

FILE *fopen(const char *path, const char *mode);

  fopen 函数返回值类型为 FILE 。参数列表中, path 为文件路径, mode 为打开方式。

 打开文件的方式有如下几种:

r打开文本文件进行阅读。
流位于文件的开头。
r+开放读和写。
流位于文件的开头。
w打开文件进行写入。如果文件不存在,则创建该文件,否则文件被清空。
流位于文件的开头。
w+开放读和写。如果文件不存在,则创建该文件,否则文件被清空。
流位于文件的开头。
a打开以追加(在文件末尾写入)。
如果文件不存在,则创建该文件。
流位于文件的末尾。
a+打开以进行读取和追加(在文件末尾写入)。
如果文件不存在,则创建该文件。用于读取的初始文件位置位于文件的开头,
但输出始终附加到文件末尾。

2、fprintf

int fprintf(FILE *stream, const char *format, ...);

printf 不同, printf 默认向显示器打印消息,而 fprintf 则可以指定文件流,向指定文件打印。

编写如下代码:

  1 #include <stdio.h>
  2 
  3 #define LOG "log.txt"
  4 
  5 int main()
  6 {
  7   FILE* fp = fopen(LOG, "w");
  8   if(fp == NULL)
  9   {
 10     perror("fopen");
 11     return 1;
 12   }
 13 
 14   const char* msg = "hello world";                                                                                                      
 15   int cnt = 5;
 16   while(cnt)
 17   {
 18     fprintf(fp, "%s: %d: ljb\n", msg, cnt);
 19     //fputs(msg, fp);
 20     cnt--;
 21   }
 22 
 23   fclose(fp);
 24   return 0;
 25 }

运行观察结果:

 也可以使用 fprintf 函数向显示器文件里打印,以实现和 printf 函数相同的效果:

3、snprintf

int snprintf(char *str, size_t size, const char *format, ...);

 snprintf 函数可以把内容打印到缓冲区里,并且通过设置参数 size 控制打印的长度。

编写如下代码:

  1 #include <stdio.h>  
  2   
  3 #define LOG "log.txt"  
  4   
  5 int main()  
  6 {  
  7   FILE* fp = fopen(LOG, "w");  
  8   if(fp == NULL)  
  9   {  
 10     perror("fopen");
 11     return 1;
 12   }
 13   
 14   const char* msg = "hello world";
 15   int cnt = 5;
 16   while(cnt)
 17   {
 18     char buffer[256];
 19     snprintf(buffer, sizeof(buffer), "%s: %d:ljb\n", msg, cnt);
 20     printf("%s", buffer);
 21   }                                                                                                                                     
 22                                                                                                                               
 23   fclose(fp);                                                                                                                 
 24   return 0;                                                                                                                   
 25 } 

 运行观察结果:

二、系统文件IO

1、open

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

 open 函数参数列表中, pathname 为文件路径与文件名, flags 为要打开文件的选项(以位图形式传递), mode 为打开文件的权限。返回值为文件描述符

flags参数:

  • O_RDONLY:只读打开
  • O_WRONLY:只写打开
  • O_RDWR:读,写打开
  • O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
  • O_APPEND:追加写(需要配合O_WRONLY使用)
  • O_TRUNC:将文件清空

返回值:

  • 成功:新打开的文件描述符
  • 失败:-1
     

 编写如下代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <unistd.h>
  6 #include <errno.h>
  7 #include <string.h>
  8 
  9 #define LOG "log.txt"
 10 
 11 int main()
 12 {
 13   umask(0);                                                                                                                             
 14   int fd = open(LOG, O_CREAT | O_WRONLY, 0666);                                                                 
 15   if(fd == -1)                                                                                                  
 16   {                                                                                                             
 17     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));                                   
 18   }                                                                                                             
 19                                                                                                                 
 20   else                                                                                                          
 21     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));                                   
 22                                                                                                                 
 23   close(fd);                                                                                                    
 24                                                                                                                 
 25   return 0;                                                                                                     
 26 }   

 其中 O_CREAT O_WRONLY 为宏定义,传递参数 flags  O_CREAT 为如果文件不存在,则自动创建该文件。 O_WRONLY 为以只读模式打开文件。需要注意的是,他们不会对原始文件内容做清空,下一次写入时,虽然还是从开头开始写,但是原本的内容没被覆盖的部分仍然会残留

运行观察结果:

 如图所示,打开文件所返回的文件描述符 3

 刚刚被创建的 log.txt 文件的权限为 666 

2、write

ssize_t write(int fd, const void *buf, size_t count);

 write 函数的参数列表中, buf 为缓冲区首地址, count 为本次读取,期望写入多少个字节的数
据。 返回值:实际写了多少字节数据。

编写如下代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <unistd.h>
  6 #include <errno.h>
  7 #include <string.h>
  8 
  9 #define LOG "log.txt"
 10 
 11 int main()
 12 {                                                                                                                                       
 13   umask(0);
 14   int fd = open(LOG, O_CREAT | O_WRONLY, 0666);
 15   if(fd == -1)
 16   {
 17     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));
 18   }
 19   else
 20     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));
 21 
 22   const char* msg = "hello world";
 23   int cnt = 5;
 24   while(cnt)
 25   {
 26     char line[128];
 27     snprintf(line, sizeof(line), "%s, %d\n", msg, cnt);
 28 
 29     write(fd, line, strlen(line));
 30     cnt--;
 31   }
 32 
 33   close(fd);
 34 
 35   return 0;
 36 }

 需要注意的是,这里的数据字节数使用的是 strlen(line) ,而不是 strlen(line) + 1 。这是因为字符串最后一定要加 '\0' 是C语言的规定,而不是文件的规定。

3、read

ssize_t read(int fd, void *buf, size_t count);

 read 函数的参数列表中, buf 为缓冲区首地址, count 为本次读取,期望读取多少个字节的数
据。 返回值:实际读取了多少字节数据。 

 编写如下代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <unistd.h>
  6 #include <errno.h>
  7 #include <string.h>
  8 
  9 #define LOG "log.txt"
 10 
 11 int main()
 12 {                                                                                                                                    
 13   umask(0);                                                                                                                          
 14   int fd = open(LOG, O_RDONLY);                                                                                                      
 15   if(fd == -1)                                                                                                                       
 16   {
 17     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));
 18   }
 19   else
 20     printf("fd: %d, error: %d, errstring: %s\n", fd, errno, strerror(errno));
 21 
 22   char buffer[1024];
 23 
 24   ssize_t n = read(fd, buffer, sizeof(buffer) - 1);
 25   if(n > 0)
 26   {
 27     buffer[n] = '\0';                                                                                                                   
 28     printf("%s\n", buffer);
 29   }
 30 
 31   close(fd);
 32 
 33   return 0;
 34 }

 使用系统接口来进行IO的时候,一定要注意 '\0' 的问题。

运行观察结果:

4、C文件接口与系统文件IO的关系

 fopen、fclose、fwrite、fputs、fread、fgets 都是C标准库当中的函数,我们称之为库函数(libc)。
 open、close、write、read都属于系统提供的接口,称之为系统调用接口。

 可以认为,f#系列的函数,都是对系统调用的封装,方便二次开发。


关于系统文件接口的内容就讲到这里,希望同学们多多支持,如果有不对的地方欢迎大佬指正,谢谢!

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

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

相关文章

优加DaaS背后,看见新的营销潮

DaaS、融合开放&#xff0c;这是京东云优加对外传递出来的两个最清晰的声音。前者对应的是能力和边界&#xff0c;后者对应的是态度和打法。两者结合&#xff0c;恰构成了京东云优加&#xff0c;或者说京东在营销侧的未来想象力。 作者|皮爷 出品|产业家 “今年我们有接近60%以…

第五章 工厂模式

文章目录 一、简单工厂模式1、传统方式实现披萨订购( 可以忽略)披萨父类 Pizza子类胡椒披萨 PepperPizza子类印度披萨 GreekPizza订购披萨 OrderPizza订购披萨的 客户端 PizzaStore运行结果传统的方式的优缺点&#xff0c;新增子类需要修改的地方牵扯太多传统方式的究极耦合 2、…

YOLOv8 更换骨干网络之 MobileNetV3

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

BswM模块之Ecu State Handling

文章目录 前言一、ESH是什么&#xff1f;二、基于BswM管理的ECU状态切换流程1.ECU启动2.ECU关闭 总结 前言 BswM – 基础软件模式管理模块&#xff0c; 它的职责是基于简单规则的BSW模块仲裁来自应用层sw - c或其他模块的模式请求&#xff0c;并根据仲裁结果进行相应的操作。 …

QT QPainter 绘制基本图形元件简介

1.基本图形元件 QPainter 提供了很多绘制基本图形的功能&#xff0c;包括点、直线、椭圆、矩形、曲线等&#xff0c;由这些基本的图形可以构成复杂的图形。QPainter 中提供的绘制基本图元的函数如下表所示。每个函数基本上都有多种参数形式&#xff0c;这里只列出函数名&#x…

Elastic Common Schema 和 OpenTelemetry — 无需供应商锁定即可获得更好的可观察性和安全性的途径

作者&#xff1a;Elastic 可观察性和安全团队 在 KubeCon Europe 上&#xff0c;宣布 Elastic Common Schema (ECS) 已被 OpenTelemetry (OTel) 接受作为对该项目的贡献。 目标是将 ECS 和 OpenTelemetry 的语义约定 (SemConv) 融合到一个由 OpenTelemetry 维护的开放模式中。 …

LearnOpenGL-模型加载

1.配置Assimp库。 下载Assimp&#xff0c;解压后得到 assimp-master 文件。在文件中新建一个 build 文件。使用 Cmake 生成工程文件保存在 build 中&#xff0c;从这里下载CMake&#xff0c;下载最新的即可。 打开CMake&#xff0c;选择需要源文件目录和目标目录。修改成适配…

机器学习平台、自研DPU、资源并池,火山引擎发布多云、AI基础设施与增长法宝

1、每十家大模型企业&#xff0c;七家在火山引擎云上。 2、火山引擎大模型训练云平台&#xff0c;支持万卡训练&#xff0c;集群性能提升3倍 3、火山引擎新一代自研DPU&#xff0c;实现计算、存储、网络的全组件卸载&#xff0c;释放更多资源给业务负载。 4、火山引擎与字节国内…

数据库管理软件dbeaver-ce 下载安装并离线配置

文章目录 前言数据库管理软件dbeaver-ce 下载安装并离线配置1. 概述2. 下载3. 安装4. 离线配置驱动jar包5. 链接mysql 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天…

谷歌aab包手机怎么安装教程

一、概述 bundletool是一种底层工具&#xff0c;可供 Android Studio、Android Gradle 插件和 Google Play 用于构建 Android App Bundle 文件并将 app bundle 转换为部署到设备的各种 APK。您也可以将 bundletool作为一种命令行工具&#xff0c;用于自行构建 app bundle 和重新…

【笔试强训编程题】Day2.(排序子序列 100448)和(倒置字符串 69389)

文章目录 前言 一、排序子序列 100448 题目描述 代码实现 二、倒置字符串 69389 题目描述 代码实现 总结 前言 今天让我们来练习两道经典的编程题&#xff01;&#xff01;&#xff01;&#xff01; 一、排序子序列 100448 题目描述&#xff1a;牛牛定义排序子序列为…

平台资金提现解决方案之实现支付宝单笔转账到银行卡功能

大家好&#xff0c;我是小悟 使用场景 不管是做APP、电脑网站、手机网站还是小程序&#xff0c;为了推广基本上都离不开用户分佣的场景。 换句话说就是在其平台内为每个用户设置“电子钱包”功能&#xff0c;而电子钱包在平台那里只是一串数字&#xff0c;这就需要平台为用户…

详解 ES6中 Promise 构造函数的使用

文章目录 前言什么是 Promise&#xff1f;Promise 的几种状态拆分细解 PromisePromise all&#xff08;&#xff09;方法then()方法 返回一个新的 Promise 时的状态由什么决定&#xff1f;总结 前言 Promise 是ES6 新增的一个异步调用解决方案&#xff0c;它的出现是为了解决异…

Elasticsearch的调优思路

环境&#xff1a;centos7、elasticsearch-5.6.4 1、性能调优 1.1、Linux参数调优 1.1.1、关闭交换分区 目的是防止内存置换降低性能&#xff0c;将 /etc/fstab 文件中包含 swap 的行注释掉。 #执行命令&#xff1a;注释相关 swap的行 sed -i /swap/s/^/#/ /etc/fstab#将 /etc/f…

彻底弄清FreeRTOS中的事件组(Event Groups)

​之前已经学过两个任务之间可以利用信号量、队列来通信&#xff0c;任务可以利用这两个机制等待某一个事件发生&#xff0c;但是假如需要等待多个事件发生呢&#xff1f;这就需要用到事件组了。 事件组可以让任务进入阻塞态&#xff0c;等待一个或多个事件的组合发生。当事件…

根据 cadence 设计图学习硬件知识 day02 了解飞腾 X100芯片

1. 飞腾芯片 X100的介绍 飞腾套片X100是一款微处理器的配套芯片&#xff0c;主要功能包括图形图像处理和接口扩展两类。在图形图像处理方面&#xff0c;集成了图形处理加速GPU、视频解码VPU、显示控制接口DisplayPort以及显存控制器&#xff1b;在接口扩展方面&#xff0c;支持…

【矩形面积】

题目来源&#xff1a;https://leetcode.cn/problems/rectangle-area/ 目录 矩形面积 矩形面积 题目介绍 给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形&#xff0c;请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xf…

数字化转型危与机,20年老厂的升级之路

“投资大、周期长、见效慢”&#xff0c;是每一家企业在考虑数字化战略时&#xff0c;都会纠结的问题。 打江山容易&#xff0c;守江山难 企业在快速扩张的过程中&#xff0c;往往可以不需要过多的考虑细节的问题&#xff0c;跑马圈地的打法会更加有效。 但是市场占有量开始饱…

JS Array数组常用方法

会改变原数组的方法 1、array.push(需要在末尾添加的数据)【给数组末尾添加一个元素】 2、array.unshift(需要在首位添加的数据)【给数组首位添加一个元素】 3、array.pop()【从数组末尾删除元素,不需要传参】 4、array.shift()【从数组首位开始删除元素,不需要传参】 5、arra…

数据处理方法(LFSR)

一、线性反馈移位寄存器&#xff08;LFSR&#xff09;编码概述 线性反馈移位寄存器&#xff08;LFSR&#xff09;&#xff1a;通常由移位寄存器和异或门逻辑组成。其主要应用在&#xff1a; 伪随机数&#xff0c;伪噪声序列&#xff0c;计数器&#xff0c;BIST&#xff0c;数据…