深入理解IO底层

news2024/11/24 17:46:51

文章目录

  • 上层使用
    • 向文件写入
    • 从文件读取
  • 函数解释
    • fopen函数
    • fclose函数
    • fread函数
    • fwrite函数
  • 系统接口
    • 向文件写入
    • 从文件读取
  • 函数解释
    • open函数
    • close函数
    • 文件描述符
    • write函数和read函数
  • FILE

上层使用

向文件写入

文件的写入
#include <stdio.h>
#include <string.h>

int main()
{
  FILE* fp = fopen("log.txt", "w");
  if(fp == NULL)
  {
    perror("fopen");
  }
  const char* str = "abcdefg";
  fwrite(str, strlen(str), 1, fp);
  fclose(fp);
  return 0;
}

结果:
在这里插入图片描述

从文件读取

文件的读取
#include <stdio.h>
#include <string.h>
                                   
int main()
{  
  FILE* fp = fopen("log.txt", "r");
  if(fp == NULL)                        
  {              
    perror("fopen");
  }   
  char buf[1024];                       
  // while(1)    
  //{  
  //  ssize_t s = fread(buf, 1, 5, fp);
  //  if(s > 0)           
  //  {
  //    buf[s] = 0;
  //    printf("%s", buf);
  //  }
               
  //  if(feof(fp))
  //  {
  //    break;
  //  }                             
  //}       
     
    ssize_t s = fread(buf, 1, 5, fp);
    if(s > 0)           
    {              
      buf[s] = 0;
      printf("%s", buf);
      printf("\n");
    }
  fclose(fp);
  return 0;
}                 

结果:
在这里插入图片描述

函数解释

fopen函数

在这里插入图片描述
参数path:是要被打开文件的路径
参数mode:是打开模式,指明打开后是要读还是写
如果被打开的文件不存在就创建该文件
返回值是一个结构体指针,该结构体中包含文件描述符

fclose函数

在这里插入图片描述
参数是一个结构体指针,该结构体中包含文件描述符,该函数用于关闭一个文件
在这里插入图片描述
返回值FILE是C语言自己封装的结构体,该结构体中包含文件描述符

fread函数

用于从文件中读取
参数ptr:指从文件中读取的数据要放到的位置的地址
参数size:是指一次要读取几个字节,它是按块读取的
参数nmemb:是要读取几个块这么大的数据
参数stream:是指要从哪个文件流中读取
返回值:实际读取了几个这么大的块

fwrite函数

用于向文件中写入
参数ptr:是指要读取的那一段数据的地址
参数size:是一次要写入的块大小
参数nmemb:是要写入几个size这么大的数据
参数stream:是指要从哪个文件流中写入
返回值:实际写入了几个这么大的块
向文件中写入时要+1吗?也就是加上’\0’?
不用,至于为什么在下面的底层原理讲解

系统接口

其实上述几个函数都是一些系统调用函数接口进行封装提供给用户的库函数,那么为什么系统不直接把那些函数提供给用户呢?因为操作系统不信任用户。
接下来我们来学习一下上面这些函数的系统调用接口

向文件写入

使用:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main()
{
  umask(0);
  int fd = open("mytext", O_WRONLY | O_CREAT, 0644);
  if(fd < 0)
  {
    perror("open");
    return 1;
  }

  int count = 5;
  const char* str = "hello Linux!\n";
  int len = strlen(str);

  while(count--)
  {
    write(fd, str, len);
  }
  return 0;

}

结果:
在这里插入图片描述

从文件读取

函数解释

open函数

原理:
在这里插入图片描述
参数pathname:指要打开或创建的文件的路径
参数flags:该参数其实类似于位图,通过不同比特位的位置进行按位与或或等操作代表着不同的选项,因此通过这一个数字就可以代表着多个选项
在这里插入图片描述
打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开----read
O_WRONLY: 只写打开-----write
O_RDWR : 读,写打开-----read+write
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写,不覆盖之前已有的----append
O_WRONLY和O_RDWR的区别就是O_WRONLY不能进行读,也就是不能进行cat等操作
在这里插入图片描述
参数mode:
mode有模式的意思,用于设置要被创建的这个文件的权限,如果要被写入的文件已经有了,则这个参数就不没用了,上述代码中我们也用到了权限掩码umask,它默认是0002,我们在创建时给的参数是0446,如果想要结果就是0446,那么就需要把这个掩码改为0000,我们有两种做法,一种是改变整个环境的掩码,另一种就是改变该进程中的掩码,上面函数中设置的umask(0)就是只在这个进程中有效
返回值
成功:新打开的文件描述符
失败:-1

close函数

该函数用于关闭一个已被打开的文件
原理:

在这里插入图片描述
参数fd:
参数fd就是open函数的返回值(文件描述符)

文件描述符

什么是文件描述符?
通过刚才的open函数的返回值,我们知道了这个文件描述符就是一个int类型的数,那么这个数指的是什么呢?
先来了解一下文件被创建的过程,一个进程可以打开或关闭,创建多个文件,而在这个过程中又是怎么对这么多的文件进行管理的呢?
每个进程里面都有一个files的指针,指向一张叫做files_struct的表,该表最重要的部分就是包涵一个指针数组,数组中每个元素都是一个指向打开文件的指针。所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件
每一个文件结构体是用链表进行连接起来的,如果想要删除或打开某一个文件就把该文件指针从该链表添加或删除,并且也从对应的指针数组中添加或删除,这个结构体中包含文件被谁打开,属性,权限,指向下一个文件结构体的指针等,那么如果一个文件被多个进程打开,怎么解决什么时候关闭的问题呢,这里就要用到引用计数了,当这个文件不再被某一个进程打开时,这个文件才会被关闭
为什么我们打开电脑就能使用键盘和显示器灯硬件设备进行写和读呢?那是因为操作系统会给我们默认打开三个文件描述符,分别是stdin,stdout,stderror而他们对应的下标分别是标准输入0,标准输出1,标准错误2。
0,1,2对应的物理设备一般是:键盘,显示器,显示器
那么怎么去证明呢?通过write和read函数来证明:

write函数和read函数

在这里插入图片描述
在这里插入图片描述
参数fd从哪个文件流中读取或写入
buf就是把buf里的数据写入放到文件或者从文件中读取数据放到buf里
count:要读取或写入多少字节
返回值ssize_t:实际写入或读取多少字节,例如你想写入20字节但buf里只有15字节,那么如果写入成功,则返回值ssize_t就是15,读取数据也是一样,返回值是实际读取或写入的字节个数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
  char buf[1024];
  ssize_t s = read(0, buf, sizeof(buf));
  if(s > 0)
  {
    buf[s] = 0;
    write(1, buf, strlen(buf));
    write(2, buf, strlen(buf));
  }
  return 0;
}

在这里插入图片描述
传递的参数fd,其实就是文件描述符,而文件描述符中0,1,2分别对应的就是标准输入,标准输出,标准错误

FILE

上面一直说FILE是C语言自己封装的一个结构体,该结构体中包含文件描述符,上层函数传递给系统调用接口的FILE结构体指针,本质上传递的是文件描述符
上层函数和系统接口对比:
1.
在这里插入图片描述
在这里插入图片描述
2.
在这里插入图片描述
在这里插入图片描述
3.
在这里插入图片描述

在这里插入图片描述
4.

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

3、Python基础语法:解释器、标识符、关键字、缩进

文章目录 Python解释器标识符关键字缩进代码示例与运行结果Python是一种高级编程语言,以其简洁明了的语法和强大的功能而受到广泛欢迎。本文将介绍Python的一些基础语法元素,包括解释器、标识符、关键字和缩进,并提供相应的代码示例和运行结果。 Python解释器 Python是一种…

【C语言基础教程】内存的申请和释放(malloc、free、realloc、calloc)

文章目录 前言一、为什么需要指针的内存的申请和释放&#xff1f;二、malloc 函数2.1 函数原型2.2 示例代码 1: 使用 malloc 分配动态数组2.3 示例代码 2: 使用 malloc 分配字符串 三、free 函数3.1 函数原型3.2 使用方法3.3 示例代码 1: 使用 free 释放动态数组内存3.4 示例代…

电脑时间校对怎么做?看这里,分享4个方法!

“我的电脑时间总是和手机的时间不一样&#xff0c;应该是电脑的时间不准确了&#xff0c;想知道大家遇到这种情况时是如何校对电脑时间的呀&#xff1f;” 随着电脑在我们日常生活中的广泛应用&#xff0c;确保电脑时间准确性变得至关重要。电脑时间校对不仅有助于同步文件和通…

共享WiFi贴码真实收益怎样?如何扩大盈利!

随着移动互联网的快速发展&#xff0c;共享WiFi贴码成为了一个备受关注的话题。这一模式的兴起引起了很多人的关注&#xff0c;因为它似乎为一些创业者提供了一种全新的获取收益的模式。然而&#xff0c;共享WiFi贴码的真实收益到底如何呢&#xff1f; 共享WiFi贴码的基本原理是…

【PC】第2期《全知 PUBG 视角》概要

各位玩家大家好&#xff0c;欢迎收看本期公告。 得益于各位玩家的大力支持&#xff0c;第2期《全知 PUBG 视角》直播已经圆满落下了帷幕&#xff0c;非常感谢各位对我们的喜爱。在直播的热度过去之前&#xff0c;我们也已趁热打铁&#xff0c;为大家准备好了可供所有地区玩家观…

Leetcode-141 环形链表

使用HashSet&#xff0c;从头遍历链表并写入哈希表&#xff0c;遍历每个元素找哈希表是否出现过&#xff0c;如果出现过则存在环。 HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#xff0c;即不会记录…

【Linux】-文件操作(重定向、缓冲区以及Linux下一切皆文件的详解)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

使用Nokogiri库的Python程序

python import requests from bs4 import BeautifulSoup import os # 设置 proxies {"http": "", "https": ""} # 设置headers headers { User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (K…

SI24R2E应用于2.4G有源RFID养老院方案

随着人口老龄化的加剧&#xff0c;养老院、颐养小镇、养护院、疗养院等针对养老的机构可以说是层出不穷。而为了方便管理&#xff0c;这些养老机构都有一个共同点&#xff0c;实现无感式的人员定位以及物品管理等功能。 方案介绍 我司推出的2.4G有源RFID养老院方案&#xff0c;…

NOIP2000提高组第二轮T4:方格取数

题目链接 [NOIP2000 提高组] 方格取数 题目描述 设有 N N N \times N NN 的方格图 ( N ≤ 9 ) (N \le 9) (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0 0 0。如下图所示&#xff08;见样例&#xff09;: 某人从图的左上…

学习c++的第十四天

目录 动态内存 new 和 delete 运算符 命名空间 定义命名空间 using 指令 不连续的命名空间 嵌套的命名空间 模板 函数模板 类模板 C 中 typename 和 class 的区别 函数模板的重载 动态内存 了解动态内存在 C 中是如何工作的是成为一名合格的 C 程序员必不可少的。…

二.ACW154. 滑动窗口详解

窗口滑动: 几行代表for里的语句 1行看队列,例子.空的不执行 2行q[0]1 3行看队列.1>-1不执行 4行看例子例子.窗口不完整 ht1,只看最后一行的总队列q就行1行.2<6不执行,只存越来越大 2行q[1]2,所以q存的下标 3行.i在增加,1>0不执行,新循环了,对头元素滑出窗口 4行窗口不…

使用Python自动修改电脑的静态IP地址

目录 一、引言 二、实现思路 三、详细步骤 四、Python代码 五、注意事项 六、适用性和局限性 七、总结 一、引言 在网络应用中&#xff0c;有时我们需要频繁更改电脑的静态IP地址。例如&#xff0c;当我们在不同网络环境&#xff08;家庭、办公室&#xff09;中使用电脑…

AMEYA360荣获“国际潜力之星分销商”奖!

由全球电子技术领域知名媒体集团ASPENCORE主办的“全球电子元器件分销商卓越表现奖"颁奖典礼于2023年11月3日晚在深圳大中华喜来登酒店圆满结束! 全球电子元器件分销商卓越表现奖创办于2001 年&#xff0c;迄今已成功举办20年&#xff0c;此奖项旨在表彰支持电子产业发展的…

电脑监控软件丨2023全网最详细解析

电脑监控软件是一个比较敏感的话题&#xff0c;因为很多员工会觉得电脑监控侵犯了自己的隐私&#xff0c;电脑上企业会觉得安装软件只不过是为了保护自己的核心利益。 对于此&#xff0c;我们要辩证的看待。 今天我们从企业的角度出发&#xff0c;谈谈电脑监控软件的话题。 必…

【数据结构】 二叉树理论概念!一文了解二叉树!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 数据结构解析 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️树的概念☁️树的结构☁️树的小知识☁️树的表示与运用 &#x1f324…

Android View 触摸反馈原理浅析

重写OnTouchEvent() 然后在方法内部写触摸算法 返回true,表示消费事件,所有触摸反馈不再生效,返回事件所有权 if (event.actionMasked MotionEvent.ACTION_UP){performClick()//抬起事件 执行performClick 触发点击 }override fun onTouchEvent(event: MotionEvent): Boolea…

办公套件全家桶 Office2019 mac中文版新功能

office 2019 mac是 Microsoft office 应用程序套件的最新版本。它包括流行的软件&#xff0c;例如 Microsoft Word、Excel、PowerPoint 和 Outlook&#xff0c;office 2019 比其前身有许多新功能和改进&#xff0c;包括增强的协作工具、与 OneDrive 和 SharePoint 等云服务的更…

Figma 怎么切图?新手入门教程详解

Figma 是一个基于浏览器的协作的UI设计工具&#xff0c;其以轻量、便捷、跨平台使用、协同便捷的特点&#xff0c;迅速吸引了广大UI/UX 设计师们的喜欢。但是设计师经常遇到反复切图、交付开发等问题&#xff0c;所以借此机会分享一篇关于 Figma 切图的必要知识点和交付经验。 …

基于 VTable 的多维数据展示的原理与实践

多维表格介绍 多维表格又名透视表、交叉表、Pivot Table&#xff0c;指的是可以在行维度和列维度放入一个或多个维度&#xff0c;显示维度之间相互关系的一种表格。用户可以一目了然地分析出各种场景指标以及对比&#xff0c;旨在帮助业务分析推动决策。 假设需要分析如下表格…