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

news2025/1/11 4:04:43

        在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

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

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

相关文章

Python 网络编程之粘包问题

【一】粘包问题介绍 【1】粘包和半包 粘包: 定义: 粘包指的是发送方发送的若干个小数据包被接收方一次性接收,形成一个大的数据包。原因: 通常是因为网络底层对数据传输的优化,将多个小数据包组合成一个大的数据块一次…

Python综合数据分析_RFM用户分组模型

文章目录 1.导入数据2.月度订单数据可视化3.数据清洗4.特征工程5.构建User用户表6.求R值7.求F值8.求M值9.显示R、F、M值的分布情况10.显示手肘图辅助确定K值11.创建和训练模型12.给R值聚类13.给聚类后的层级排序14.继续给F、M值聚类,并排序15.为用户整体分组画像 1.…

vue-quill-editor富文本插入图片改为上传服务器

1.安装vue-quill-editor npm install vue-quill-editor 2.安装依赖 npm install quill 3.代码引用 import { quillEditor } from vue-quill-editor; // 引入Qill插件 import Quill from quill; import quill/dist/quill.core.css; // import styles import quill/dist/quill.s…

Java热插拔技术之SPI

文章目录 背景SPI是什么SPI和API的区别Java SPI实践出真知总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 背景 最近,公司需要针对一个使用C#的系统以插件的形式进行二…

中仕公考:2024年度河南省公务员考试公告发布!共招录9900人!

河南省2024年度统一考试录用公务员公告于今日发布,共计划招录9900人。 报名时间:1月18日9:00-1月24日17:00 笔试时间:3月16日-3月17日 报名方式:登录“河南人事考试网”进行网上报名 2024年省考29.5%的…

CSS中的width与height

CSS中的width与height 1 display: inline-block2 width: auto2.1 外部尺寸与流体特性2.1.1 正常流宽度2.1.2 格式化宽度 2.2 内部尺寸与流体特性2.2.1 包裹性2.2.2 首选最小宽度2.2.3 最大宽度 3 height: 100%3.1 如何让元素支持height: 100%效果 1 display: inline-block 我们…

健康之钥:新生儿维生素K的呵护指南

引言: 维生素K,在新生儿的成长旅程中扮演着不可忽视的角色。它对于血液凝结和骨骼发育至关重要。本文将深入探讨维生素K的功能、补充时机,以及在给新生儿补充维生素K时应该注意的事项,为小天使们提供最贴心的呵护。 第一部分&…

动态内存面试的经典题目

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

大创项目推荐 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 🔥 优…

Resize:最近邻插值、双线性插值、双三次插值

Resize:最近邻插值、双线性插值、双三次插值 Opencv resize函数1. 最近邻插值(INTER_NEAREST)1.1 原理1.2 代码实例1.3 简单的代码复现1.4 特点 2. 双线性插值(INTER_LINEAR)(默认值)2.1 原理2.…

Rust-解引用

“解引用”(Deref)是“取引用”(Ref)的反操作。取引用,我们有&、&mut等操作符,对应的,解引用,我们有操作符,跟C语言是一样的。示例如下: 比如说,我们有引用类型p:&i32;,那么可以用符…

[笔记]深度学习入门 基于Python的理论与实现(三)

代码仓库 gitee 3. 神经网络 神经网络的出现就是为了解决设定权重的工作,即机器自动从数据中学习,确定合适的、能符合预期的输入与输出的权重。 3.1 从感知机到神经网络 神经网络和感知机有很多共同点,这里主要介绍差异 3.1.1 神经网络例子…

数据库|数据库范式(待完成)

文章目录 数据库的范式数据库的基本操作什么是数据库的范式产生的背景(没有规范化的坏处/带来的问题)规范化表格设计的要求五大范式的作用——树立标准打个比方——桥的承载能力1NF(1范式)如何转换成合适的一范式 2NF(…

Flask 项目怎么配置并创建第一个小项目?附上完成第一个小案例截图

目录 1. 为什么要学习 flask? 2. flask 是什么? 3. flask 如何使用? 要安装 Flask,可以按照以下步骤进行: 4. 使用流程 4.1. 新建项目 4.1.1. 打开 pycharm,新建项目 4.1.2. 设置目录,并…

centos7 arm服务器编译安装PaddlePaddle

前言 随着国产服务器发展,部署项目需要用在国产服务器上,官方教程里面很多没有讲解到,安装过程中出现了各种各样的问题,以下是对官方教程的补充,有什么问题,欢迎指正! 一、环境准备 gcc: 8.2版…

Python 网络编程之TCP详细讲解

【一】传输层 【1】概念 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务主要协议包括**TCP(传输控制协议)和UDP(用户数据报协议)** 【2】功能 **端到端通信:**传输层负责…

数学建模-预测人口数据

目录 中国09~18年人口数据 创建时间 绘制时间序列图 使用专家建模器 得到结果 预测结果 残差的白噪声检验 中国09~18年人口数据 创建时间 路径:数据-> 定义日期和时间 绘制时间序列图 使用专家建模器 看看spss最终判断是那个模型最佳的契合 得到结果 预…

什么是NTFS格式文件系统?Tuxera NTFS for Mac2024下载步骤

一般磁盘格式分为:FAT、FAT32、NTFS,这几种格式目前是我们最常遇到的文件系统格式,其中现在遇到最多的就是NTFS格式,为更好地了解这类文件系统格式,小编今天专门介绍一下什么是NTFS格式文件系统以及它的特点和局限性。…

网络安全ctf比赛/学习资源整理,【解题工具、比赛时间、解题思路、实战靶场、学习路线】推荐收藏!

对于想学习或者参加CTF比赛的朋友来说,CTF工具、练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容齐全,收藏备用。 1、C…

Chapter 10 类的继承(上篇)

目的:了解三种继承方式,并清楚其中的差别 🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃…