【Linux】文件操作

news/2024/7/27 8:47:53/文章来源:https://blog.csdn.net/qq_64076540/article/details/136428120

文章目录

  • 预备知识
  • C语言文件接口
    • fopen()函数
      • w方式
      • a方法
    • fwrite()
    • fprintf()
    • fputs()
    • fread()
    • fgets()
    • 标准输入输出流
  • 系统调用接口
    • 标志位
    • 文件权限
    • fclose()
    • write()
    • read()

前言:本文探讨的是“打开的”文件。

预备知识

如进程一样,文件 = 文件属性 + 文件内容

文件属性包括:文件的大小,文件的创建日期,文件的拥有者和所属组等等。

文件内容就是你对文件写入的内容。

对文件的操作 = 对文件属性的操作 + 对文件内容的操作

访问文件的本质是进程在访问文件

而进程访问文件是需要接口的,进程访问文件是通过系统调用接口,而我们平时使用的访问文件的接口是语言接口

语言接口就是对系统调用接口的封装。

语言接口有很多,(C语言有C语言的接口,java有java的接口……)但是他们最终都能访问到磁盘上的文件,这是为什么呢?

难道磁盘为了这些语言而专门写了这些接口吗?显然不是,是系统调用的接口是只有一个 ,后续语言就是对系统调用进行封装。

所以,看似各种语言使用的不同的接口,其实用的同一套底层接口。

在这里插入图片描述

C语言文件接口

fopen()函数

查看C语言的打开文件接口
在这里插入图片描述
对于fopen()函数
作用:打开文件/创建文件
参数

  1. const char* path: 打开文件的路径/创建文件的路径
  2. const char* mode: 对文件进行的操作

对于mode,可以看文档

mode说明
r读模式,允许读取文件
r+读写模式,可以同时读,也可以同时写。(原有文件内容都会被保存。)
w清空写模式,如果文件不存在,则自动创建。如果文件已经存在,把原有的文件内容删除光。再写入新的内容。
w+清空读写模式,读新写入的内容。
a就是append,在文件最后追加新写入的内容。文件不存在就创建新文件

有这些操作的内容,接下来通过示例演示以下:
在这里插入图片描述
观察结果:
在这里插入图片描述
在这里插入图片描述
本程序是在/home/zyy/Linux-learning/24-02-04-lesson/中执行的,所以在这里创建了一个进程。

我们创建文件的路径是/home/zyy/Linux-learning/,所以在该路径下也创建了一个进程。

可以观察到两个进程的pid是不一样的,说明我们在运行自己创建的程序的时候,创建了一个进程,在程序运行本身调用了创建/打开文件函数,也创建了一个进程。

w方式

#include<stdio.h>2 #include<string.h>3 4 int main()5 {6   FILE* fp = fopen("test.txt", "w");7   if(fp == NULL)8   {9     return 1;10   }11 12   const char* s = "hello in message";13   fwrite(s, strlen(s), 1, fp);                                                                                                             14   fclose(fp);15   return 0;16 }

在这里插入图片描述

a方法

1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6   FILE* fp = fopen("test.txt", "a");7   if(fp == NULL)8   {9     return 1;10   }11 12   const char* s = "hello in message\n";                                                                                                    13   fwrite(s, strlen(s), 1, fp);14   fclose(fp);15   return 0;16 }

在这里插入图片描述

fwrite()

在这里插入图片描述

功能:            向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。
const void *ptr  指向要被写入的数组元素的指针
size_t sizoe     表示每个元素的大小
size_t nmemb     表示要写入多少个这种元素
FILE* stream     表示fopen()打开文件之后返回的文件指针

使用方法:
在这里插入图片描述

fprintf()

在这里插入图片描述

功能:                 格式化输出到一个流文件中(把s输出到fp中)
FILE* stream          文件指针,fopen()打开的那个文件返回的文件指针
const char *format    格式化输出
……                    可变参数列表   

使用方式:
在这里插入图片描述
执行结果:
在这里插入图片描述

fputs()

在这里插入图片描述

功能:          向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)
const char *s  写入的字符串
FILE *stream   文件指针

在这里插入图片描述

fread()

在这里插入图片描述

功能:            从文件中读取若干字节数据到内存缓冲区中
const void *ptr  将文件中的二进制数据读取到该缓冲区中
size_t sizoe     读取的基本单元,单位是字节
size_t nmemb     读取的基本单元的个数
FILE* stream     表示fopen()打开文件之后返回的文件指针

使用方式:
在这里插入图片描述
结果:
在这里插入图片描述

fgets()

在这里插入图片描述

功能:从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。
char *s:   要存到的内存空间的首地址
int size:  读取字符串的长度
FILE *stream: 从何种流中读取,可以是标准输入流stdin

使用:在这里插入图片描述

结果:
在这里插入图片描述

标准输入输出流

执行程序时,C语言会默认打开三个标准输入输出文件。

  1. stdin 标准输入
  2. stdout 标准输出
  3. stderr 标准错误

在这里插入图片描述

系统调用接口

在这里插入图片描述

功能:打开/创建一个文件或者设备
const char *pathname:  要打开的文件的路径
int flages:            标志位(以读/写的方式打开)
code_t mode:           权限设置

标志位

第二个参数是标志位,告诉open函数是要以读还是以写的方式打开文件,第二个参数必须包含O_RDONLY, O_WRONLY, 以及 O_RDWR 中的一个。

  • O_WRONLY:以写的方式打开文件
  • O_RDONLY:以读的方式打开文件
  • O_WRONLY:以读写的方式打开文件

在此基础上可以附加其他参数

  • O_CREAT:当文件不存在时,创建文件
  • O_APPEND:在文件末尾追加

问题1:只有一个参数,如何同时传多个参数呢?
问题2:为什么参数类型是int?

两个问题可以同时回答。
32位下有 32个bit位,我们以低8位为例。
假设第一位表示以写的方式打开: 0000 0001 O_WRONLY
假设第二位表示以读的方式打开: 0000 0010 O_RDONLY
假设第三位表示文件不存在时创建: 0000 0100 O_WRONLY
而如果我想文件不存在时创建文件并且以写的方式打开,就可以使用按位或的方式
0000 0001
0000 0100
————————
0000 0101
结果: int flag = O_WRONLY|O_CREAT

在这里插入图片描述

文件权限

在这里插入图片描述
文件权限分为三部分:用户权限,组权限,其他权限
示例是644,为8进制表示。
用2进制表示:示例中-rw -rw r-- 表示为 011 011 100 ,转化为8进制就是 664。
我们一般设置权限为666。

返回值是int类型的文件描述符

使用:

在这里插入图片描述
结果:
在这里插入图片描述

fclose()

在这里插入图片描述
传入文件描述符即可。
作用:关闭文件。

write()

在这里插入图片描述

功能: 向fd中写入字节数为count的buf内容
int fd 文件描述符,标识要写入的文件
void *buf 要写入的内容
size_t count 向文件中写入多少字节

在这里插入图片描述
结果:
在这里插入图片描述
如果更换写入内容:
在这里插入图片描述
结果:
在这里插入图片描述
不会对内容进行清空,会对内容进行覆盖
如果想清空需要加上O_TRUNC
在这里插入图片描述
结果:
在这里插入图片描述

read()

在这里插入图片描述

功能:将fd中的内容读到buf中,读count个字节

用法:

在这里插入图片描述

向test.txt文件中写入的内容:
在这里插入图片描述
结果:
在这里插入图片描述

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

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

相关文章

xinput1_3.dll丢失都有什么办法可以有效的解决、xinput1_3.dll导致游戏不能启动怎么办?

使用电脑的过程中是不是会遇到关于某个dll文件丢失的提示&#xff0c;今天想和大家聊的是xinput1_3.dll文件&#xff0c;如果电脑提示xinput1_3.dll丢失有什么办法可以有效的解决&#xff0c;解决办法都有哪些&#xff0c;如果xinput1_3.dll丢失会对电脑有什么影响。&#xff0…

【AI视野·今日Robot 机器人论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 6 Mar 2024 Totally 30 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;SpaceHopper,外星探索多功能三足机器人 (from Robotic Systems Lab, ETH Zurich) Daily Robotics Papers A Safety-Criti…

Java红黑树实现Map简单示例

红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它是由 Rudolf Bayer 在 1972 年提出的&#xff0c;后来由 Leo J. Guibas 和 Robert Sedgewick 在 1978 年发表的论文中形式化定义。 红黑树具有以下特性&#xff1a; 1.节点颜色&#xff1…

亚信安慧AntDB:数据管理的创新先锋

在亚信安慧AntDB数据库中&#xff0c;其卓越的创新能力得以充分体现&#xff0c;其独特之处在于融合统一与实时处理这两大关键领域。AntDB以其独特的技术和理念&#xff0c;引领着数据库领域的发展潮流&#xff0c;成为众多企业和机构首选的数据库解决方案。在这个信息化时代&a…

AI加速“应用现代化”,金融核心系统转型正当时

数字经济时代&#xff0c;金融机构需要快速感知客户需求&#xff0c;提升产品供给的敏捷度&#xff0c;才能在白热化的竞争环境中抢占先机&#xff0c;而无论是金融机构还是方案提供商&#xff0c;都需要深入思考核心系统现代化的内涵&#xff0c;携手迈出应用现代化的重要一步…

【Qt】初识Qt

文章目录 一. 行业岗位介绍二. 什么是客户端&#xff1f;三. GUI 开发的各自技术方案四. 什么是框架&#xff1f;五. Qt 的发展史五. Qt 支持的系统六. Qt 的优点 一. 行业岗位介绍 二. 什么是客户端&#xff1f; 既然 Qt 是用来进行客户端开发的&#xff0c;那我们就要了解什…

Python遗传算法搜索最优最短路径

程序示例精选 Python遗传算法搜索最优最短路径 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python遗传算法搜索最优最短路径》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

手回科技:人生的“小雨伞”,能否撑起自己的增长路?

有道是一年之计在于春。新年伊始&#xff0c;多家券商发布研报表达了对2024年保险市场表现的观点。 比如&#xff0c;开源证券表示&#xff0c;政策组合拳带来beta催化&#xff0c;保险业务端和弹性占优&#xff1b;中国银行证券指出&#xff0c;2024年&#xff0c;保险行业景…

[C#]winform基于C2PNet算法实现室内和室外图像去雾

【CP2Net框架】 https://github.com/YuZheng9/C2PNet 【CP2Net介绍】 Abstract 考虑到不适定的性质&#xff0c;发展了单图像去模糊的对比正则化&#xff0c;引入了来自负图像的信息作为下界。然而&#xff0c;对比样本是非一致的&#xff0c;因为阴性通常距离清晰&#xff…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

Django学习记录——管理员-登录注销的实现

1.管理员案例 1.1管理员数据库 1.1.1 表结构 1.1.2 管理员表的建立 class Admin(models.Model):"""管理员表"""username models.CharField(max_length32, verbose_name"用户名")password models.CharField(max_length64, verbose…

基于Java的快递管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

Qt 类的前置声明和头文件包含

1. 在头文件中引入另一个类经常有两种写法 1&#xff09;前置声明 2&#xff09;头文件包含 #ifndef FRMCOUPLE2_H #define FRMCOUPLE2_H#include <QWidget> //头文件包含namespace Ui { class frmcouple2; }//前置声明&#xff1a;QPushButton frmchkeyboard…

Python与FPGA——膨胀腐蚀

文章目录 前言一、膨胀腐蚀二、Python实现腐蚀算法三、Python实现膨胀算法四、Python实现阈值算法五、FPGA实现腐蚀算法总结 前言 腐蚀是指周围的介质作用下产生损耗与破坏的过程&#xff0c;如生锈、腐烂等。而腐蚀算法也类似一种能够产生损坏&#xff0c;抹去部分像素的算法。…

C++指针(四)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

Netty权威指南——基础篇4 网络通信基础 备份

1 TCP粘包/拆包 TCP是个“流”协议&#xff0c;所谓流&#xff0c;就是没有界限的一串数字。可以想象河里流水&#xff0c;是连成一片的&#xff0c;其间没有分界线。TCP底层并不了解上层业务数据的具体含义&#xff0c;它会根据TCP缓冲区的实际情况进行包的划分&#xff0c;一…

GNURadio+USRP+OFDM实现文件传输

文章目录 前言一、发送端1、参数配置1&#xff09;Random Source2&#xff09;stream to Tagged stream3&#xff09;Stream CRC324&#xff09;Protocol Formatter5&#xff09;Repack Bits6&#xff09;Virtual Sink7&#xff09;Chunks to Symbols8&#xff09;Tagged Strea…

【Web安全靶场】upload-labs-master 1-21

upload-labs-master 其他靶场见专栏… 文章目录 upload-labs-masterPass-01-js前端校验Pass-02-MIME校验Pass-03-其他后缀绕过黑名单Pass-04-.hatccess绕过Pass-05-点空格点代码逻辑绕过Pass-06-大小写绕过Pass-07-空格绕过Pass-08-点号绕过Pass-09-::$DATA绕过Pass-10-点空格…

网络编程:TCP机械臂,UDP文件传输

1.TCP机械臂测试 程序代码&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.112" //服务器IP3 #define SER_PORT 8888 //服务器端口号4 5 #define CLI_IP "192.168.126.121" //客户端IP6 #define CLI_PORT 9999 //…