【Linux学习】文件系统 - 第一篇

news2024/9/21 16:33:32
🍑个人主页:Jupiter.
🚀 所属专栏:Linux从入门到进阶
欢迎大家点赞收藏评论😊

在这里插入图片描述

📕文章目录

      • `📚基础知识铺垫`
      • `🍑重新使用C语言文件接口---对比重定向`
        • `🎈fopen函数`
        • `🌏fputs`
        • `🌙fwrite`
        • `🚀fread(一次全部读取)`
        • `🔍fgets(按行读取)`
      • `🌌C标准输入输出流`
        • `⭐fscanf`

📚基础知识铺垫

文件由文件属性与文件内容构成,所以空文件也会占用空间的,因为有文件属性。文件=文件内容+属性

对文件进行操作的时候,都是通过执行代码的方式完成操作,操作必须先将文件打开,打开文件的目的就是将文件从磁盘加载到内存。(内存级文件,没有打开的就在磁盘)

是谁打开文件呢?是进程在打开(这个很好理解,不赘述)。注意:一个进程可以打开多个文件。

在一定时间内,系统中存在多个进程,同时可能存在更多的被打开的文件,OS系统会管理这些文件,先描述,再组织。后续文章会具体讲解OS怎么管理的。


🍑重新使用C语言文件接口---对比重定向

🎈fopen函数

在这里插入图片描述
简单介绍:
参数一:需要打开的文件路径。
参数二:是以哪种方式打开。

打开方式选项的介绍:
在这里插入图片描述

选项打开方式注意事项
r以只读的方式打开文件不存在,则打开失败,返回NULL
r+以读写的方式打开文件不存在,则打开失败,返回NULL
w以只写的方式打开文件不存在,则创建文件,返回文件的指针 ,每次写之前会将文件清空
w+以读写方式打开文件不存在,则创建文件,返回文件的指针 ,每次写之前会将文件清空
a以追加写的方式打开文件不存在,则创建文件,返回文件的指针 ,不会清空,在文件末尾追加的方式写
a+以读与追加写的方式打开文件不存在,则创建文件,返回文件的指针 ,不会清空,在文件末尾追加的方式写

我们可以发现,指令> 与 >>选项w和a有类似的效果。输出与追加重定向的本质就是向文件里面写入,向文件里面写入需要先打开文件,这里猜测输出重定向之前文件要以w的方式打开,所以会先被清空,而追加重定向是以a的方式打开。


补充知识

以w等其他方式打开,如果文件不存在,则会在当前目录下建立一个文件。

那什么叫做当前目录呢?

  • 上一篇自定以shell里面已经知道了进程的当前路径可以通过环境变量来获取,这里介绍一个新的方法:通过指令ls查看文件 ./proc/进程编号 来查看,其中cwd即使当前目录。如图所示:
    在这里插入图片描述

其中可以使用该函数chdir来改变当前工作路径,使新建文件建立在指令路径中,上一篇文章讲过,这里不再赘述。


向文件中写操作的接口很多,比如fwrite,fputs,puts....

简单介绍几个:

🌏fputs

在这里插入图片描述
简单介绍:

参数一:是一个字符串,想要写进文件的内容。
参数二:是想写进哪一个文件。

代码示例:

int main()
{
     FILE* fp = fopen("log.txt","w");
     if(fp==NULL)
     {
         perror("fopen");
     }
     const char* msg="hello fputs";
     fputs(msg,fp);
 
     fclose(fp);
 }


🌙fwrite

在这里插入图片描述
简单介绍:

参数一:要写入的字符串。
参数二:写入基本单元的大小。
参数三:要写多少个基本单元。
参数四:写进哪一个文件。

如果成功就返回写的数据块的个数,失败就返回0。

示例代码:

 int main()                                        
 {                                                 
     FILE* fp = fopen("log.txt","w");              
     if(fp==NULL)                                  
     {                                             
         perror("fopen");                          
     }                                             
     const char* msg="hello fputs";                
     //fputs(msg,fp);                              
     size_t n = fwrite(msg,strlen(msg),1,fp);    //n=1
     //size_t n = fwrite(msg,1,strlen(msg),fp);  //n=strlen(msg)
     printf("%d\n",n);                                                                                                                 
                                                                          
     fclose(fp);                                                          
     return 0;                                                            
 }                    

介绍几个读文件的接口:

🚀fread(一次全部读取)

在这里插入图片描述
简单介绍:

参数一:读出来的内容放到ptr字符串中。
参数二:读的基本单元的大小。
参数三:要读多少个基本单元。
参数四:从哪一个文件读。

返回值:如果成功就返回写的数据块的个数,失败就返回0。

代码示例:

 int main()
 {
     FILE* fp = fopen("log.txt","r");
     if(fp==NULL)
     {
         perror("fopen");
     }
     char* msg;                                                                                                                             						               
     size_t n = fread(msg,strlen(msg),1,fp);  //n=1
     printf("%d\n",n);
 
     fclose(fp);
     return 0;
 }

🔍fgets(按行读取)

在这里插入图片描述
简单介绍:

参数一:读取的内容放在哪里。
参数二:读取的大小 ,参数三:从哪里读。

返回值:成功返回s,失败返回NULL。

示例代码:

 int main()
 {
     FILE* fp = fopen("log.txt","r");
     if(fp==NULL)
     {
          perror("fopen");
     }
     char buffer[64];
     while(1)
     {
         char* rstr = fgets(buffer,sizeof(buffer),fp);                                                                                 
         if(rstr==NULL) break;
         printf("%s\n",buffer);
     }
 
     fclose(fp);
     return 0;
 }


🌌C标准输入输出流

在这里插入图片描述
C 默认会打开三个输入输出流,分别是stdin(标准输入,键盘设备), stdout(标准输出,显示器设备), stderr(标准错误,显示器设备)
仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针

这些是可以直接使用的。

示例代码:

int main()
 {
     char *msg = "hello world";
     fputs(msg,stdout);    //msg字符串打印在标准输出(显示器上)
     
     return 0;
 }

⭐fscanf

在这里插入图片描述
简单介绍:

fscanf 与scanf 相比多了第一个参数,scanf是从标准输入获取数据,fscanf是从stream中获取数据;

代码示例:

int main()
 {
     FILE* fp = fopen("log.txt","r");
     if(fp==NULL)
     {
         perror("fopen");
     }
     int n = 0;
     fscanf(fp,"%d",&n);
     printf("%d\n",n);
     fclose(fp);
     
     return 0;
 }      

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

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

相关文章

[云原生]三、Kubernetes(1.18)

主要内容: 1、kubernetes 简介 2、kubernetes 集群搭建  方式搭建  二进制方式搭建 3、 kubeadm kubernetes 核心技术  YAML 文件详解  kubectl 命令工具  Pod  Label  Controller 控制器 …

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法: machineIdSync 此函数同步获取操作系统本机UUID/GUID,默认情况下进行哈…

深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】

ReLU(Rectified Linear Unit)激活函数 ReLU(Rectified Linear Unit)激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下: ReLU ( x ) max ⁡ ( 0 , x ) \text{ReLU}(x) \max(0, x) ReLU(x)max(0,x) 在…

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…

Java中的五种线程池类型

Java中的五种线程池类型 1. CachedThreadPool (有缓冲的线程池)2. FixedThreadPool (固定大小的线程池)3. ScheduledThreadPool(计划线程池)4. SingleThreadExecutor (单线程线程池&#xff09…

CTFHUB-SSRF-DNS重绑定 Bypass

开启题目,页面空白,访问附件 附件是一个知乎的文章,翻到下面点击文中这个链接 跳转之后,进行设置 把得到的链接拼接到题目的后面进行访问,然后得到了本题的 flag

Leetcode3226. 使两个整数相等的位更改次数

Every day a Leetcode 题目来源:3226. 使两个整数相等的位更改次数 解法1:位运算 从集合的角度理解,k 必须是 n 的子集。如果不是,返回 −1。怎么用位运算判断,见上面的文章链接。 如果 k 是 n 的子集,…

Windows Batch Linux Shell

windows上使用unix,Linux的unix工具对应的windows的可执行exe程序,对于本来的windows用户也可以使用这些工具提高工作效率,特别地在windows的批处理中使用这些命令很方便 二 工具列表 agrep.exe ansi2knr.exe basename.exe bc.exe bison.exe…

图像生成技术的颠覆性进展——从GAN到Aura SR V2

欢迎来到我们的科技专栏!最近,文本到图像合成技术的成功引起了全球的轰动,激发了公众的无限想象力。从技术角度看,这也标志着在设计生成图像模型的架构上发生了巨大的变化。曾经,生成对抗网络(GANs&#xf…

【Material-UI】详解安装指南

文章目录 一、默认安装1.1 Peer Dependencies 二、使用styled-components三、Roboto字体3.1 使用Fontsource3.2 使用Google Web Fonts 四、图标4.1 使用Google Web Fonts 五、CDN安装六、总结 Material-UI是全球最受欢迎的React UI框架之一。它提供了丰富的组件和高度可定制的主…

CSDN 的 Markdown 编辑器图片居中对齐和设置图片大小的方法

图片对齐方式 加在文件格式后面 #pic_center #pic_left #pic_right例如: 居中对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/eb16b0a5bc414b9888ab73f3c74a8acb.png#pic_center)左对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

AI答题应用平台相关面试题

目录 1、请介绍整个系统后端的架构设计,有哪些模块以及各模块之间的关系? 2、你在项目中是如何设计库表的?可以从字段、索引、关联等方面回答。 3、为什么使用策略模式来封装不同的应用评分算法?它有哪些好处?具体如…

Elasticsearch 的DSL查询,聚合查询与多维度数据统计

文章目录 搜索聚合高阶概念 搜索 即从一个索引下按照特定的字段或关键词搜索出符合用户预期的一个或者一堆cocument,然后根据文档的相关度得分,在返回的结果集里并根据得分对这些文档进行一定的排序。 聚合 根据业务需求,对文档中的某个或…

【源码+文档+调试讲解】营业厅宽带系统设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Action部署在线上写文章

原文:https://blog.c12th.cn/archives/32.html 前言 之前分别出了 Hexo 和 Hugo 的 Action搭建教程,相当于伪动态,可以在线上写文章了;不过对于喜欢魔改的同学就不太友好了qwq 教程 github.dev 确保在配置过程中能访问Github &…

学工系统学生家庭情况登记功能概述

智慧校园学工系统中的“学生家庭情况”模块主要用于收集和管理学生的家庭背景信息,以便学校更好地了解学生的情况,并据此提供相应的支持和服务。该模块通常包括以下几个方面: 基本信息录入:支持录入学生的家庭成员信息&#xff0c…

ocaml精解【1】

文章目录 概述简介一、基本概述二、开发工具三、语言特性四、应用场景五、未来展望 windows下安装基础 参考文献 概述 简介 OCaml(Objective Caml)是Caml编程语言的主要实现,由Xavier Leroy、Jrme Vouillon、Damien Doligez、Didier Rmy等人…

一款免费强大的电脑锁屏工具,中文绿色免安装

这款软件主要特点是锁屏后不显示密码输入框,直接输入密码即可解锁。 ScreenBlur是一款功能强大的电脑屏幕锁软件,主要用于保护用户的隐私和数据安全。该软件的主要功能包括自动锁屏、隐藏桌面、加密锁机等。 功能特点 自动锁屏:用户可以设…

C语言之unsigned long long与struct相互转换实例(五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

数学希腊符号

1、Α α alpha /a:lf/ 阿尔法 2、Β β beta /bet/ 贝塔 3、Γ γ gamma /ga:m/ 伽马 4、Δ δ delta /delt/ 德尔塔 5、Ε ε epsilon /epsilon/ 伊普西龙 6、Ζ ζ zeta /zat/ 截塔 7、Η η eta /eit/ 艾塔 8、Θ θ thet /θit/ 西塔 9、Ι ι iot /aiot/ 约塔 10、Κ κ …