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

news2025/1/22 19:55:05

目录

前言

回顾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"方式把文件打开。

【>】 

【>>】

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

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

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

相关文章

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年&#xff0c;江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始&#xff0c;该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念&#xff0c;全力以赴为客户构建专业的工业有机废气治理整体解决方案&#xff0c;进而成为国家高新技术企…

Java基础语法规范

语法规范 public class HelloWorld{ //类名&#xff1a; 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法&#xff0c;该⽅法从{开始到}结束…

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者&#xff1a;田向阳&#xff0c;联通西部创新研究院 大数据专家 共创&#xff1a;SelectDB 技术团队 导读&#xff1a; 数据是 5G 全连接工厂的核心要素&#xff0c;为支持全方位的数据收集、存储、分析等工作的高效进行&#xff0c;联通 5G 全连接工厂从典型的 Lambda 架…

华为SSH实验

华为SSH实验 实验拓扑&#xff1a; 实验要求&#xff1a;从SSH客户端AR1采用stelnet方式登录到SSH 服务器端。 实验步骤&#xff1a; 1.完成基本配置&#xff08;略&#xff09; sys Enter system view, return user view with CtrlZ. [AR1]sys CLIENT [CLIENT]INT g0/0/0 [C…

【IB Protocal Serial--WQE】

IB Protocal Serial--WQE 1 Intro1.1 What1.2 IBA WQE 本系列文章介绍RDMA技术的具体实现–InfiniBand Protocal&#xff1b; Introduce the features, capalities,components, and elements of IBA. the principles of operation. 1 Intro 1.1 What 理解IB协议下面这三句话对…

思迈特受邀参加工信部等权威机构行业盛会,探讨AI领域前沿技术

近日&#xff0c;思迈特软件作为国产BI领域知名厂商&#xff0c;多次受邀出席行业盛会&#xff0c;与众多业内专家学者、行业精英及知名企业代表等汇聚一堂共襄盛会&#xff0c;探讨行业前沿热点研究及最新趋势&#xff0c;分享企业数字化建设创新成果与成功实践&#xff0c;共…

一文学懂Base64编码原理

前言 Base64编码与ASCII编码一样&#xff0c;也是一种编码方式。不同的是ASCII码采用7位二进制数表示&#xff08;包括大小写字母、数字、标点符号和一些不可见字符&#xff09;&#xff0c;而Base64采用6位二进制数表示&#xff08;包括大小写字母、0~9数字、和/&#xff09;…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源&#xff1a;考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1&#xff0e;在悬空部位作业时&#xff0c;操作人员应&#xff08; &#xff09; A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】&#xff1a;D…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 你有没有听说过Nginx的账户认证功能&#xff1f;这可不只是一个技术问题&#xff0c;它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样&#xff0c;Nginx的账户认证功能就是确保有只有授权的人才能…

C# 写一个简单的Windows Service的服务程序

项目创建及设定部分 使用VS2019创建项目&#xff0c;选择C# Service的选项 按照你喜欢的方式命名&#xff0c;我这边就默认了 添加安装服务&#xff0c;在Service1.cs[Design]中 在设计界面右击&#xff0c;选择如下的"Add Installer" 在出现的"ProjectInstall…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

jenkins 用户权限(Manage-Roles)

本次需求将DEV环境和SIT环境分开,SIT用户登录上来只能看他的SIT项目和视图 安装roles插件 进入 manage role 项目授权 用户 正则匹配你需要的项目 dev .*-dev*或者.*-dev$ sit .*-sit最后细分assign role 测试使用sit账号登录 ,视图和项目都是SIT账号的

PG 窗口函数

一&#xff0c;简介 窗口函数也叫分析函数&#xff0c;也叫OLAP函数&#xff0c;通过partition by分组&#xff0c;这里的窗口表示范围&#xff0c;&#xff0c;可以不指定PARATITION BY,会将这个表当成一个大窗口。 二&#xff0c;应用场景 &#xff08;1&#xff09;用于分…

LeeCode热题100(1)

本文纯干货&#xff0c;看不懂来打我&#xff01; 自己先去看一下第一题的题目两数之和&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 简单来说就是让你在一个数组里面找两个数&#xff0c;这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示&#xff1a;由于软件包的更新&#xff0c;所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包&#xff1a;installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出&#xff0c;是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序&#xff1a; 运行结果&#xff1a; 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较&#xff0c;如同对数值…

树形结构-CRUD接口

先看一下效果&#xff1a;整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…

算法简单笔记4

5月31号&#xff0c;明天决赛&#xff0c;今天脑子也是一滩浆糊&#xff0c;踏马的一道题也做不出来&#xff0c;超级难受&#xff0c;只好简单复盘一下两道之前的题目&#xff0c;看完就差不多了&#xff0c;再学也没啥用了&#xff0c;写完这两题题解我就回去打把steam绝地求…