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自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大ÿ…...
人工智能在数据安全中的应用场景
场景一:数据资产梳理 数据资产梳理是数据安全的基础。知道企业究竟有多少数据,这些数据在哪里?有哪些类型的数据?其中哪些是敏感数据?这些数据的敏感等级分别是什么?只有明确了保护的目标,才能…...
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中采购文档价格条件可以删除吗?
首先要声名,基于采购价格条件的严谨性和历史追朔需求,删除属于危险操作。不建议普通用户去执行操作。如果有兴趣,在测试系统中自行测试一下即可。正式系统中,还请慎重处理。 笔者公司日常不会去删除采购价格,日常处理…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
