当前位置: 首页 > news >正文

Linux下文件的创建写入读取编程

        在linux下操作一个文件,首先要保证文件的存在(不存在就创建),接着打开文件(打开成功)并得到文件描述符,接着在进行读写操作,最后还需要关闭文件。如果我们对文件进行读写之后不关闭文件,而直接关闭我们的编译器,可能会造成文件损坏。

         文件描述符其实就是我们使用open函数后一个返回值,我们一般用fd表示。如果你成功的打开文件,open就会返回一个非负值,我们让fd等于这个非负值;如果你打开文件失败,open就会返回-1,那么fd就被赋值为-1。

         如果说我们的文件夹是一本书,文件是书本的章节,那么文件描述符就相当于我们书本的索引(就是一个目录,标示了你想要找的东西的位置)。当你想要读写文件的内容时,你需要利用相应的API函数,而这些API函数的其中一个参数就是文件描述符。API函数通过“文件描述符”这个索引就可以找到文件并对该文件进行操作。

一、Linux常用操作命令

Ctrl Alt t

开启命令窗口

xrandr

显示所有的分辨率

xrandr -s 分辨率

设置自己想要的分辨率

Ctrl l

清屏

Ctrl shift +或者Ctrl +

放大文字

Ctrl -

缩小文字

pwd

显示当前文件路径

ls

显示当前路径下有哪些文件(不包含隐藏文件)

ls -a

显示当前路径下有哪些文件(包含隐藏文件)

ls -l

显示当前路径下文件的创建时间大小及用户使用权限

mkdir 文件夹名

创建文件夹

rm -r 文件夹名

删除文件夹

rm 文件名

删除文件

cd 文件夹名

进入文件夹

cd ..

返回上一级目录

mv *c 新文件夹名

把当前目录下名字以c结尾的文件或文件夹剪切到新文件夹里

mv 文件名1 文件名2

把文件1的名字命名为文件2

mv 文件夹名1 文件夹名2

把文件夹1的名字命名为文件夹2

cp 文件1 文件2

把文件1的内容复制到文件2

cp -r 文件夹1 文件夹2

把文件夹1的内容复制到文件夹2

vi 文件名.c

创建.c文件,进入后默认为命令行模式,按i进入输入模式;按Esc由输入模式进入命令模式。接着输入:wq回车,保存退出。

gcc 文件名.c

编译该.c文件,默认生成名为a.out的可运行文件

./a.out

运行a.out文件

gcc 文件名.c -o 新文件名

编译该.c文件,生成以新文件命名的可运行文件

./新文件名

运行新文件名的文件

vim -r 文件名

打开上一次奔溃的文件

vimdiff 文件名1 文件名2

在同一显示屏下比较两个文件,并显示不同的部分

clear

清屏

ps -aux

查看所有进程

cat 已有文件名

查看文件内容

cat > 新文件名

创建新文件,可以再文件里写入内容,按ctrl c退出

ps -aux|grep 类型名

查看这一类型的进程

top

查看任务管理器

getpid

获取自身进程id号

getppid

获取父进程id号

二、相关API函数

1.创建/打开文件

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

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

int creat(const char *pathname, mode_t mode);

参数

Pathname:要打开的文件名字(包含路径,缺失为当前路径)

Flags:

必须要有的选项,三选一

O_RDONLY 只读打开   O_WRONLY 只写打开   O_RDWR可读可写打开

备用常用选项,可用“|”叠加

O_CREAT:若文件不存在则创建该文件。使用后,要搭配第三个参数mode,以此来说明该新文件的存取许可权限。

O_EXCL:如果同时指定了O_CREAT,并且文件已经存在则打开文件失败,返回-1。

O_APPEND:每次书写都加到文章末尾

O_TRUNC:如果该文件已经存在,并且是一个常规文件,并且访问模式允许写入(即,是O_RDWR或O_WRONLY)它将被截断为长度0。

Mode:在flag中使用了O_CREAT标志后,可以使用该参数设置待创建文件的访问权限

关于mode的参数补充

每个Linux文件具有四种访问权限:可读(r)、可写(w)、可执行(x)和无权限(-)。

利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为准。第一个字段由10个字符组成,如 -rwxr-xr-x,我们把它划分为4部分

第1位为第一部分,表示文件类型,-表示文件,d表示目录

第2-4位为第二部分,表示文件所有者的权限,u权限

第5-7位为第三部分,表示文件所有者所属组成员的权限,g权限

第8-10位为第四部分,表示所有者所属组之外的用户的权限,o权限  

2-10位的权限总和有时称为a权限

以上例子中,表示这是一个文件(非目录),文件所有者具有读、写和执行的权限,所有者所属组成员和所属组之外的用户具有读和执行的权限而没有写的权限。

如果我们使用int open(const char *pathname, int flags, mode_t mode)函数参数mode是数字,那我们如何用数字表示第二第三第四部分的权限呢?

所谓数字表示法,是指将r、w和x分别用4、2、1来代表,没有授予权限的(即-)则为0,

比如我们刚刚举得例子rwxr-xr-x,它的2到10位一共三个部分的权限,我们划分来看。

第二部分是rwx,对应数字是421,加起来就是7;第三部分是r-x,对应数字是401,加起来就是5;第四部分是rwx,对应数字是401,加起来就是5。所以如果mode用数字表示就是755,具体的例子,下面的程序再说。

如果打开成功,返回新的文件描述符(一个非负整数),如果发生错误,一般返回-1。

与②API函数的区别在有无mode,而需不需要mode这个参数,就要看第二个参数里是否包含O_CREAT。如果有O_CREAT,就要包含mode这个参数;如果没有,就不用包含这个参数。因为如果包含O_CREAT同时文件没有,那么文件就需要被创建,被创建的同时还需要规定文件的访问权限,这就需要mode的参与。

这个API函数可以直接去输入你想要的文件名,以及权限,就可以实现文件的创建了

2.写入文件

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

参数:

fd:文件打开后对应的文件描述符

buf:写入内容缓冲区

count:写入文件的大小

如果写入成功,则返回写入的字节数。如果出现错误,则返回-1,并设置errno以指示错误的原因。

3.读文件

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

参数:

fd:文件打开后对应的文件描述符

buf:读内容缓冲区

count:读入文件的大小

如果写入成功,则返回读的字节数。如果出现错误,则返回-1,并设置errno以指示错误的原因。

4.文件光标移动

off_t lseek(int fd, off_t offset, int whence);

参数:

fd:文件打开后对应的文件描述符

offset:相对于whence偏移的位置。0,不偏移;正整数,向右偏移对应的大小;负整数,向左偏移对应的大小。

whence:光标起始位置,一共有三个选项,如下

SEET_SET         文件开头

SEET_CUR         文件当前位置

SEET_END         文件尾部

如果成功,则返回相对于文件头的偏移量。如果出现错误,则返回-1。如果我们设置为

lseek(fd,0,SEET_END)就可以利用他的返回值来表示文件的大小了。

5.关闭文件

⑦int close(int fd);

参数

fd:文件打开后对应的文件描述符

关闭成功返回零。如果出现错误,则返回-1,并适当地设置errno。

三、API函数的功能验证

1.文件创建的验证

   在当前目录下,我们是没有file1文件的,这时候我们建立demo1.c,使用int open(const char *pathname, int flags)无法打开file1。如下图

当前文件下无file1

demo1.c的代码

执行完demo1.c,文件描述符fd的返回值是-1,说明打开文件失败

建立demo2.c使用int open(const char *pathname, int flags, mode_t mode)先进行判断,如果没有file1,显示失败时的文件描述符,接着建立file1后在显示正确的文件描述符;如果有file1,直接显示正确的文件描述符。

demo2.c代码,

执行完demo2.c后的情况,可以看到file1从无到有,通过O_CREAT实现了file1的创建,最后的文件描述符为正值。

当前路径下输入ls -l可以查看当前路径下所有文件的权限以及状态。在demo2.c里我们将open函数的第三个参数mode设置为0600,可以看到对应的file1是对应的权限是

-rw-------,结合我们上文讲的数字表示文件权限就可以知道0600就代表者第二部分拥有可读可写的权限

2.文件写入验证

首先我们删除file1,在demo3.c里使用write函数,写入yangdong is handsome

demo3.c的代码如下

执行完demo3.c后结果如下图所示

打开file1后可以看到文件显示的内容

3.文件读取的验证

在demo3.c的基础上修该代码,首先我们要通过文件描述符的值验证file1中是否写成功入了内容。当成功写入后,我们要调用lseek()函数把文件光标置前,不然我们读取内容的时候是从文件的末尾读取的,但是你可以想象,既然文件光标都到文章末尾了,都没东西了,那你还读啥?读空气啊。所以当你往文章里写好东西之后,如果你想要读,记得把文件光标置前。

我们依旧先删除file1,在demo4.c里使用write,lseek,read函数,写入yangdong is handsome

demo4.c的代码如下

执行完demo4.c后的现象,我们可以看到写入多少,读出多少;写入什么,读出什么。

4.open函数打开文件中参数flag中可搭配选项的验证

O_EXCL功能的验证

file1此时已存在,我们可以看到demo5.c的open函数中同时加入了O_CREAT和O_EXCL,这时候文件打开失败,文件描述符被赋值为-1。

demo5.c的代码

demo5.c的运行结果

O_APPEND的验证

现在file1里面的内容是yangdong is handsome,如果想在文件中继续写入123456。但是我们在open函数里不加参数O_APPEND和加O_APPEND有啥区别呢,下面我们来看一下。

open函数里不加O_APPEND

原文件内容如下

代码如下

运行完之后file1的内容如下

我们可以看到,不过open函数里不加O_APPEND,那么我们写入文件的内容就会写入多少,覆盖原文件多少。

现在在现有file1的基础上验证open函数里加O_APPEND的情况

原文件内容如下

代码如下

运行结果如下,我们可以看到open函数里加O_APPEND后,写入的内容是从文件末尾新加进去,并没有覆盖原文件内容

验证O_TRUNC:

现在file1的内容如下

当我们在open函数中加入参数O_TRUNC以后,我们往文件中写入内容,原文件的内容会被全部删除,只显示我们新写入的东西。

代码如下

运行后file1中的内容如下,可以看到原来的内容已经被替换成了abcdefg

相关文章:

Linux下文件的创建写入读取编程

在linux下操作一个文件,首先要保证文件的存在(不存在就创建),接着打开文件(打开成功)并得到文件描述符,接着在进行读写操作,最后还需要关闭文件。如果我们对文件进行读写之后不关闭文…...

python 解析

list(pd.DataFrame) # 所有列名切片:print("显式 切片:\n", df.loc[:, "number":"sum"]) 所有行,列是从number 到sum ,前闭后开print("隐式 切片:\n", df.iloc[:, 1:3]) # 结果和上面一样转化成字典…...

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

问题原因 Unity应用(target SDK 34)上线到GooglePlay,有用户反馈fold5设备上(Android14系统)疯狂闪退,经测试,在小米手机Android14系统的版本复现成功了,奇怪的是apk直接安装没问题,而打包成aa…...

34.在排序数组中查找元素的第一个和最后一个位置

34.在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为…...

js树过滤

// 递归过滤得到每一项的hidden为false的数据 function filterTree(arr) { return arr.filter(item > { if (item.children) { item.children filterTree(item.children) } if (!item.hidden) { return true } }) }...

Java多线程并发篇----第十六篇

系列文章目录 文章目录 系列文章目录前言一、线程等待(wait)二、线程睡眠(sleep)三、线程让步(yield)四、线程中断(interrupt)五、Join 等待其他线程终止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…...

测评结果:免费的“文心一言3.5”香,但是付费的产品质量更高

文章目录 前言一、文心一言3.5生成的图片和文章1.文心一言生成的图片在文心一言3.5中输入以下内容:我的测评结果: 2.文心一言生成的文章在文心一言3.5中输入以下内容:我的测评结果: 二、ChatGPT生成的图片和文章1.ChatGPT4.0 生成…...

Matlab GUI设计基础范例(可以一步一步跟着做)

我们要做一个GUI界面,可以选择peaks、membrane和sinc三种三维图数据,选择画出surf、mesh和contour三种图像。 打开GUI 每个版本打开方式可能都不一样,但有一个是相同的,就是在命令行输入guide回车。 绘制控件 大概就绘制成这样…...

@Transactional(rollbackFor = {Exception.class})与 @Transactional区别

在Spring框架中,Transactional 注解用于标记方法或类,以表明该方法或类内包含的数据库操作应当在一个事务中执行。事务的基本原则是“原子性”,即所有操作要么全部成功,要么全部失败。 1. Transactional(不指定 rollb…...

数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q

目录 二叉树的定义: *特殊的二叉树: 二叉树的性质: 二叉树的声明: 二叉树的先序遍历: 二叉树的中序遍历: 二叉树的后序遍历: 二叉树的层序遍历: 二叉树的节点个数: 二叉…...

如何快速打造属于自己的接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大&#xff…...

人工智能在数据安全中的应用场景

场景一:数据资产梳理 数据资产梳理是数据安全的基础。知道企业究竟有多少数据,这些数据在哪里?有哪些类型的数据?其中哪些是敏感数据?这些数据的敏感等级分别是什么?只有明确了保护的目标,才能…...

2024.1.16每日一题

LeetCode 2719.统计整数数目 2719. 统计整数数目 - 力扣(LeetCode) 题目描述 给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数: num1 &l…...

python入门,数据容器的通用操作(len,max,min,sorted)

1.len统计容器内元素个数 2.max统计元素最大元素 3.min统计元素最小元素 4.容器的转化功能 list(容器)将给定容器转化为列表 字符串转列表将字符串内的每一个元素都取了出来作为列表的每一个元素 字典则只会取出它的key,value会消失 str&…...

运筹说 第67期 | 动态规划模型的建立与求解

通过前一期的学习,我们已经学会了动态规划的基本概念和基本原理。本期小编带大家学习动态规划模型的建立与求解。 动态规划模型的建立 一 概述 建立动态规划的模型,就是分析问题并建立问题的动态规划基本方程。 成功地应用动态规划方法的关键&#x…...

大模型压缩与优化的技术原理与创新方法

目录 前言1 模型压缩简介2 知识蒸馏3 模型剪枝3.1 结构化剪枝3.2 非结构化剪枝 4 模型量化4.1 浮点表示 vs 定点表示4.2 位数选择与性能影响4.3 量化技术 5 其他模型压缩方法5.1 Weight Sharing: 参数共享5.2 Low-rank Approximation: 低秩分解5.3 Architecture Search: 神经网…...

ConcurrentSkipListMap 深度解析

ConcurrentSkipListMap是Java集合框架中的一员,它实现了ConcurrentNavigableMap接口,基于跳表(Skip List)实现,并提供了高效的并发控制。在本文中,我们将深入研究ConcurrentSkipListMap的底层实现原理、适用…...

Vue学习笔记6--配置代理

一、axios Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 二、配置代理 1. 方法一 在…...

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第三天-C++类和对象高级应用(物联技术666)

链接:https://pan.baidu.com/s/1YRXI0WiABUlYaQXQDNfbyA?pwd=1688 提取码:1688 上午:类和对象高级应用(续) 下午:派生和继承 教学内容: 1、友元 类的私有成员只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问但是,有时候需要在类的外部访问…...

SAP中采购文档价格条件可以删除吗?

首先要声名,基于采购价格条件的严谨性和历史追朔需求,删除属于危险操作。不建议普通用户去执行操作。如果有兴趣,在测试系统中自行测试一下即可。正式系统中,还请慎重处理。 笔者公司日常不会去删除采购价格,日常处理…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

基于Springboot+Vue的办公管理系统

角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...