【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录

前言

回顾C语言的操作

Q1

Q2 

Q3 

C语言文件操作

w方式

a方式

重定向和"w""a"方式


前言

前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。

  • 深刻理解文件(站在OS的角度)
  • 深入理解重定向和缓冲区
  • 学习文件系统(磁盘文件和经典的文件系统结构)
  • 以及动静态库制作和使用,yum源的配置等操作。

回顾C语言的操作

❓在C语言阶段,我们学习了C语言是如何打开/关闭/写入/读取文件的。我们仅仅是在语言层面上学会了对文件的操作接口。不仅C/C++/Java等其他语言都有文件操作接口,文件操作都不一样,为什么不一样。

❓是否我们站在OS的角度就可以理解文件。

请看以下代码☞,思考下面问题: 

 1: testfile.c                                                                               
  1 #include<stdio.h>
  2 int main()
  3 {
  4   FILE *fd = fopen("log.txt","w");                                                                           
  5   if(fd == NULL)
  6   {
  7     perror("fopen");
  8     return 1;
  9   }
 10   fclose(fd);
 11   return 0;
 12 }

//运行可执行程序,文件不存在,OS默认创建在当前目录下

【文件指针FILE】  

【perror】

Q1

❓创建一份C语言的文件时,并没有指明文件的具体路径,代码中只是告知文件名,OS怎么知道当前创建的文件在我们想要的路径下呢。

回答:因为我们在运行我们的程序的时候,执行打开文件操作的代码的时候。 程序已经变成一个进程。所以我们创建log.txt文件时,默认会结合当前进程所在路径创建,所以如何没有路径给到OS,那么OS会结合进程当前所在路径去创建log.txt。 

❓我们写完文件操作的代码,fopen文件就算被打开了吗。

回答:文件操作的代码写完了。但是不编译运行。文件根本没有被打开。我们要进行文件操作,前提是我们的程序跑起来了,成为进程了。文件打开和关闭,是CPU在调度我们的进程,正好执行到fopen和fclose代码。打开文件的本质其实是进程打开文件!!

【进程在启动时所处的路径叫进程的当前工作路径】

Q2 

❓文件没有被打开的时候在哪里。在磁盘上

❓一个进程能打开很多文件吗。可以

❓系统中能存在很多进程吗。很多情况下,在OS内部,一定存在大量的被打开的文件。

❓OS需要对大量的文件做管理吗。肯定的。

没有被打开的文件在磁盘(硬件上),如果需要打开文件,就需要访问硬件。硬件的管理者是操作系统。一定是OS打开文件。OS打开大量的文件,就需要把这些打开的文件进行管理。(管理的六字真言:先描述再组织)

❓先描述再组织。意味着:在OS内部,也要创建文件对应对象-内核数据结构,打开文件,创建数据结构,形成很多文件对象。最后以链表的形式管理起来。对文件的管理,变成对链表的增删查改。(每一个被打开的文件,在OS内部,一定要存在对应的描述文件属性的结构体。类似PCB)

  • struct PCB(task_struct):可执行程序加载到内存中,可执行程序的内核数据结构
  • struct RunQueue:硬件有对应的等待队列
  • struct file:文件也有对应的内核数据结构(存放文件属性)
  • OS内核中一个被打开的文件本质一定是一个文件对象或者一个结构体类型的对象。
  • struct task_struct☞struct file两种对象之间的指针关系 

Q3 

 ❓新建一个大小为0的文件在磁盘需不需要占据磁盘空间。(文件没有打开,没有在内存中,在磁盘中)

回答:要占磁盘空间。文件名/时间/类型/大小/权限等文件属性等都是数据,需要占据磁盘空间。文件 = 文件属性 + 文件内容

C语言文件操作

w方式

以w方式打开文件。

  • w方式的特点:
  1. 文件存在,就清空写入
  2. 文件不存在,在当前进程的工作目录路径下创建,写入。
  3. 默认打开文件的时候,就会先把目标文件清空!
  • 写入库函数接口:fprintf
  • man fprintf
  • int fprintf(FILE *stream, const char *format, ...);
  • FILE *stream:写入指定的文件
  • const char *format, ...:以指定格式把指定内容写入
  • w      Truncate  file  to zero length or create text file for writing.

打开创建当前文件。进程被调度,执行到代码语句的时候,才会打开,写入,判断,关闭等系列文件操作(进程被调度)。里面含有/proc进程的当前工作路径。

 【文件存在,就清空写入】

【清空实验】

在存在log.txt文件且log.txt内容存在的情况下。只有打开,没有写入和关闭。我们再以w的方式打开一次文件。

原log.txt存在数据,但再以写的方式打开一次(只打开)。文件仍然存在,默认文件的内容被清空。在C语言,以w属性打开文件,文件打开即清空。

【文件不存在,在当前进程的工作目录路径下创建,写入】

a方式

以a方式打开文件。

  • a方式的特点:
  1. 文件存在,就不清空写入
  2. 文件不存在,在当前进程的工作目录路径下创建,写入。
  3. 默认打开文件的时候,就不会先把目标文件清空!
  • 文件存在且有内容的情况下,重新打开文件,写入。w方式一定会清空文件再写入;而a方式不会清空直接追加。
  • appending追加:追加的本质也是写到文件的结尾。

 【文件存在,就清空写入】

【文件不存在,在当前进程的工作目录路径下创建,写入】 

重定向和"w""a"方式

重定向回顾:

使用重定向可以极大地提高Linux命令行操作的灵活性和效率,尤其是在脚本编写和自动化任务中。

 请看下面代码☞:

  • echo "hello linux" Linux当中一切皆文件默认向显示器文件stdout打印
  • > 输出重定向本质就是把向显示器文件写入的数据,重定向向log.txt文件写入
  • 经过重定向变成了本来应该向显示器打印的内容,写入了磁盘文件中
  • 经过上面分析,我们猜测重定向一定伴随文件操作或者和文件操作有关。
  • 输出重定向一定是文件操作!

  • > 的特点:每次写入文件的数据都是存在文件,清空写入;不存在,创建写入。(每次写入都要清空)
  • 所以,推测> 是以 "w" 方式把文件打开。
  • > 可以用来新建文件,清空文件。(不存在就创建。先清空,再写入)
  • >> 的特点:存在文件,不清空写入;不存在,创建写入。
  • 所以,推测>> 是以"a"方式把文件打开。

【>】 

【>>】

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识库管理系统:是什么、作用、如何搭建

你有没有遇到过这种情况&#xff1a;在工作中想要查找某个信息&#xff0c;查找了很多个文档还是没找到准确的信息&#xff1b;或者在团队中&#xff0c;总是在重复做着相同的资料搜集工作&#xff0c;浪费了大量时间和精力&#xff1f;如果你在烦恼这个问题&#xff0c;那么跟…

【Vue3】自定义组件directiveapp.use()

历史小剧场 崇祯很勤政&#xff0c;崇祯并非王国之君&#xff0c;弘光很昏庸&#xff0c;弘光活该倒霉&#xff0c;几百年来&#xff0c;我们都这样认为。 但我们之所以一直这样认为&#xff0c;只是因为有人这样告诉我们。 之所以有人这样告诉我们&#xff0c;是因为他们希望我…

Java | Leetcode Java题解之第121题买卖股票的最佳时机

题目&#xff1a; 题解&#xff1a; public class Solution {public int maxProfit(int prices[]) {int minprice Integer.MAX_VALUE;int maxprofit 0;for (int i 0; i < prices.length; i) {if (prices[i] < minprice) {minprice prices[i];} else if (prices[i] -…

PieCloudDB Database Flink Connector:让数据流动起来

面对客户环境中长期运行的各种类型的传统数据库&#xff0c;如何优雅地设计数据迁移的方案&#xff0c;既能灵活地应对各种数据导入场景和多源异构数据库&#xff0c;又能满足客户对数据导入结果的准确性、一致性、实时性的要求&#xff0c;让客户平滑地迁移到 PieCloudDB 数据…

快递100使用

1.快递100 接口文档 链接: 接口文档 2.授权参数 授权Key: qZgsNFSo5391 customer&#xff1a;8EEA8C4FB90B275E228CA322EF0E61E5 3.技术文档 链接: 技术文档 4.使用 <dependency><groupId>com.github.kuaidi100-api</groupId><artifactId>sdk&l…

AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

【CPP】双端队列简介(deque)

简介&#xff1a;双端队列(deque) 目录 1.概述2.特点3.底层原理 1.概述 双端队列&#xff1a;是一种顺序表和顺序表的结合数据结构&#xff0c;不是队列。 它提供顺序表的[]下标访问和链表的中间头部的较高效率插入删除操作。 2.特点 顺序表的优缺点&#xff1a; 优点&…

网络安全基础技术扫盲篇 — 名词解释之“数据包“

用通俗易懂的话说&#xff1a; 数据包就像是一个信封。当你写信给某个人时&#xff0c;你将内容写在一张纸上&#xff0c;然后将纸叠起来并放入信封中&#xff0c;就形成了一个完整要发送的数据内容。信封上有发件人和收件人的详细地址&#xff0c;还有一些其他必要的信息&…

动态规划(Dynamic-Programming)问题讲解

动态规划类问题 从已知子问题的解&#xff0c;推导出当前问题的解 推导过程可以表达为一个数学公式用一维或二维数组来保存之前的计算结果&#xff08;可以进一步降维优化&#xff09; 将当前问题 分解成子问题 &#xff0c;找出递归公式&#xff0c;分阶段进行求解 求解过程中…

【scau大数据技术与原理2】综合性实验Spark集群的安装和使用——安装启动spark shell篇

实验内容简介&#xff1a; Spark是一个分布式计算框架&#xff0c;常用于大数据处理。本次实验中&#xff0c;首先设计一个包含主节点和从节点的Spark集群架构&#xff0c;并在CentOS的Linux环境下进行搭建。通过下载并解压Spark安装包&#xff0c;配置环境变量和集群参数&…

python分别保存聚类分析结果+KeyError: ‘CustomerID‘报错

如何在完成聚类分析后按聚类编号保存数据并且带上原数据所属ID # 将每个聚类的数据保存到不同的文件中 for cluster_id in range(6): # 假设共有6个聚类cluster_data data[data[cluster] cluster_id]cluster_data_with_customer_id cluster_data.copy()cluster_data_with_…

量化研究---强大的可转债分析系统上线,提供api,实时数据支持

今天把可转债实盘的分析模型拿出来&#xff0c;放在服务器方便选股分析&#xff0c;方便后面对接大qmt直接选股交易 强大的禄得可转债自定义因子轮动系统完成&#xff0c;可转债三低为例子 自定义因子实盘的框架 自定义因子轮动框架非常强大 网页 http://120.78.132.143:8023/…

MongoDB~俩大特点管道聚合和数据压缩(snappy)

场景 在MySQL中&#xff0c;通常会涉及多个表的一些操作&#xff0c;MongoDB也类似&#xff0c;有时需要将多个文档甚至是多个集合汇总到一起计算分析&#xff08;比如求和、取最大值&#xff09;并返回计算后的结果&#xff0c;这个过程被称为 聚合操作 。 根据官方文档介绍&…

day1、2-数1

数学一主要考查高数、线性代数、概率统计这三个方面&#xff0c;其中高数占比56%、线性代数占比22%、概率统计占比22% 题做完 要产生1套理论 24年真题 1. 选C sinx的话不影响奇偶 奇偶函数的积分 0到a的积分为一个常数 求导的话 奇函数导出来一定是偶函数&#xff0c;偶函…

【机器学习系列】掌握随机森林:从基础原理到参数优化的全面指南

目录 目录 一、随机森林简介 (一)随机森林模型的基本原理如下&#xff1a; (二)随机森林模型的优点包括&#xff1a; (三)森林中的树的生成规则如下&#xff1a; (四)在随机森林中&#xff0c;每棵树都使用不同的训练集进行训练&#xff0c;原因如下 随机森林的分类性能&…

day-36 删除链表的倒数第 N 个结点

思路 首先计算出链表的长度&#xff0c;然后删除第n个节点即可&#xff0c;但要注意考虑特殊情况 解题方法 特殊情况&#xff1a;1.删除节点为最后一个节点 2.删除节点为头结点 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* …

函数:计算数组的元素和

一、计算数组的元素和 参数传递给函数时&#xff0c;实际上只有数组的首地址作为指针传递给了函数。 在函数定义中的int a[ ]等价于int *a。在只有地址信息的情况下&#xff0c;是无法知道数组里有多少个元素的&#xff0c;因此在计算数组中的元素和时&#xff0c;要加一个参…

MongoDB下载安装入门 + SpringBoot简单集成

MongoDB安装入门 SpringBoot简单集成 MongoDB下载安装下载安装连接图形化界面MongoDB Compass Navicat Premium Spring Boot集成API操作添加maven配置数据库连接调用Mongo API MongoDB下载安装 下载安装 MongoDB官网地址&#xff1a;https://www.mongodb.com/ 下载地址&…

CobaltStrike基本渗透

目录 CobaltStrike简介 主要功能&#xff1a; 使用注意&#xff1a; 在使用CobaltStrike进行渗透测试时&#xff0c;务必遵守法律法规&#xff0c;并获得合法授权。 CobaltStrike安装 前提 安装 服务端安装 windows安装 CS基本使用 监听器配置 一些基本的攻击…

UnityAPI学习之游戏物体的方法使用

目录 游戏物体 创建游戏物体的三种方式 组建的获取和查找 游戏物体的方法与其他成员变量 游戏物体的生成 游戏物体的激活状态/标签(tag)/层级(layer) 游戏物体的激活与失活 游戏物体的查找 1. 名称查找(Find) 2. 通过标签查找游戏物体&#xff08;FindGameObjectWithT…