[Linux打怪升级之路]-文件操作

news2024/11/18 20:34:18

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

目录

一、认识操纵系统下的文件

1、什么是文件

2、文件的类型

3、文件的共识

二、系统级的文件操作接口 

1、文件打开open/文件关闭close

2、其他的文件接口

3、代码演示文件操作 


本期学习目标:谈谈对文件的认识,认识操纵系统的文件接口。

一、认识操纵系统下的文件

1、什么是文件

在平常我们对于文件的认识都是在window操纵系统下认为,我们建立应该目录是文件,文本文档是文件,图片是文件。

92c0fc7a681014e5e33ccafe8720c9b5.png

在Linux中有这么一句话:Linux下一切皆文件

为什么这么说的呢?

以为Linux中所以的内容都是以文件的形式保存的,我们认为普通文件是文件,一个目录我们也称为文件,甚至认为硬件设备(键盘,硬盘,打印机等)是文件。

Linux有一个根目录,其他的所以的文件都放在根目录中。

2、文件的类型

普通文件

直接就可以使用的我们就成为普通我文件,如上面的makefile就是一个普通文件

目录文件

这个文件中包含各文件的文件名和文件及指向这些文件的指针,只要有权限就可以访问目录中的任何文件,上面的myshell就是一个目录文件,我们可以到一个目录不仅仅有目录名,还有一些权限设置、文件大小等。

还行一些文件类型:字符设备文件和块设文件、套接字文件(socket)、符号链接文件(symbolic link)、管道文件(pipe)。

3、文件的共识

  1. 空文件,也要在磁盘中占据空间。
  2. 文件 = 内容 +属性。
  3. 文件操纵 = 对内容 + 对属性.
  4. 如果没有指明对应的文件的路径,和默认当前路径。
  5. 当我们通过fopen,fclose,fwrite,fread对文件进行操纵的时候,编译代码,形成可执行的程序,但是不运行,对于的文件操纵执行了吗?没有对文件的操纵,本质上是进程对文件的操纵
  6. 一个文件没有被打开,可以直接进行文件的访问吗?不能

通过上面的共识我们可以得出,对文件的操纵的本质 :是进程和打开文件的关系

二、系统级的文件操作接口 

我们在C语言和C++都有对文件的操纵函数,我们都知道文件是存放在磁盘上的,而要想访问文件就必须将磁盘上的文件导入到内存中,在进行相应的操作,其实本质上是操纵系统在对这些文件进行管理,而C语言和C++中对文件的操纵的接口,他底层也是操作系统对文件问题的接口,只是通过了封装了而已。

1、文件打开open/文件关闭close

文件打开open

 头文件:<sys/types.h>、 <sys/stat.h>、<fcntl.h>

访问形式:

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

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

当我们要调用open接口就必须包含相应的头文件,但这里要注意的是这里接口为我们提供了二个调用的方式,方式1是文件已经存在我们调用,方式2是文件不存在时要调用的接口。

接口参数:

const char *pathname:这里就指我们要打开的文件名

int flags:指是标记位,传过来的比特位,不同的比特位就调用不同选项,从对文件进行一些初始化。

mode_t mode):这里是设置相应的权限(如操作系统默认的普通文件的权限是0x666)

这里我们要重点了解open接口的第二个参数,上面我们说他是一个标记位 ,我们知道一个int是有32个比特位了,这里我们用每个位表示不同的选项。

下面我们看一段代码理解一下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>

// 每一个宏,对应的数值,只有一个比特位是1,彼此位置不重叠
#define ONE (1<<0)
#define TWO (1<<1)
#define THREE  (1<<2)
#define FOUR (1<<3)

void show(int flags)
{
    if(flags & ONE) printf("one\n");
    if(flags & TWO) printf("two\n");
    if(flags & THREE) printf("three\n");
    if(flags & FOUR) printf("four\n");
}

int main()
{
    show(ONE);
    printf("-----------------------\n");
    show(TWO);
    printf("-----------------------\n");
    show(ONE | TWO);
    printf("-----------------------\n");
    show(ONE | TWO | THREE);
    printf("-----------------------\n");
    show(ONE | TWO | THREE | FOUR);
    printf("-----------------------\n");
    return 0;
}

 

当我们运行代码,就会发现我们通过不同的比特位就调用了不同的,参数选项,出现不同的效果,open接口的参数就是这样的。

flags多个选项:

  • O_RDONLY: 只读打开
  • O_WRONLY: 只写打开
  • O_RDWR : 读,写打开
  • 这三个常量,必须指定一个且只能指定一个
  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权
  • O_APPEND: 追加写
  • O_TRUNC如果文件已经存在,且成功打开,则删除文件中原来的全部数据

对于这些选项我们还可以进行功能的多选,选项间用 “ | ” 分割

O_RDONY | O_CREAT//这里的文件用只读的方式创建,如果没有这个文件会自动创建

返回值

  • 成功:新打开的文件描述符(fd)
  • 失败:-1

文件关闭 close

 

文件关闭接口用起来非常简单,只要给他传打开文件的文件描述符就可以了。 

2、其他的文件接口

read读文件

函数原型:

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

参数 

  • fd:是文描述符
  • buf:接收读取数据的缓存区
  • count:读取的字节数
  • 返回值:读取成功则返回读取的字节数,读取到文件尾则返回0,读取失败则返回-1,同时设置全局变量errno的值来表示错误原因;

 write写文件

 

函数原型:

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

参数:

  • fd:是文描述符
  • buf:存放写入数据的缓存区
  • count:写入的中的字节数
  • 返回值:写入成功则返回实际写入的字节数,写入失败则返回-1,同时设置全局变量errno的值来表示错误原因;

3、代码演示文件操作 

下面为了更好的理解文件操作,为了大家演示了文件的打开,写入和读取数据,最后在关闭。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    //定义文件名
    char filename[] = "pjb.txt";
    //定义写入的数据
    char write_data[] = "hellow Linux!";
    //读取的数据
    char read_buf[64] = { 0 };

    //测试写入数据
    int fd = open(filename, O_RDWR | O_CREAT, O664);
    if (fd < 0)
    {
        perror("open");
        return -1;
    }
    //写入内容
    int ret = write(fd, write_data, sizeof(write_data));
    if (ret < 0)
    {
        perror("write");
        return -1;
    }
    else
    {
        printf("write: %s\n", write_data);
    }
    //关闭文件
    close(fd);
    //测试写入文件
    fd = open(filename, O_RDONLY);;
    if (fd < 0)
    {
        perror("open");
        return -1;
    }
    //写入
    ret = read(fd, read_buf, sizeof(read_buf));
    if (ret < 0)
    {
        perror("read");
        return -1;
    }
    else
    {
        printf("read: %s\n", read_buf);
    }
    close(fd);
    return 0;
}

 这里观察到我们成功向文件中写入和向文件中读取数据。

 

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

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

相关文章

python -- PyQt5(designer)中文详细教程(七)控件2

控件2 本章我们继续介绍PyQt5控件。这次的有 QPixmap &#xff0c; QLineEdit &#xff0c; QSplitter &#xff0c;和 QComboBox 。 图片 QPixmap 是处理图⽚的组件。本例中&#xff0c;我们使用 QPixmap 在窗⼜⾥显示⼀张图片。 from PyQt5.QtWidgets import (QWidget, QH…

PLC远程监控助力食品废水处理智能化管理

食品加工行业是用水大户&#xff0c;因其原料广泛、成品丰富&#xff0c;中间需要多种不同的加工工艺&#xff0c;因此排放的废水差异很大&#xff0c;废水量也不一样&#xff0c;对污水处理厂提出不同的要求。为了保证污水处理工作的稳定进行&#xff0c;保证视频废水的净化效…

Matplotlib入门[06]——figures,subplots,axes和ticks对象

Matplotlib入门[06]——figures&#xff0c;subplots&#xff0c;axes和ticks对象 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网matplotlib xticks yticks import matplotlib.pyplot as pltfigures,axes和ticks的关系 这些对象的关系可以用下图表示&…

基于jsp+mysql+ssm服装商城平台-计算机毕业设计

项目介绍 实现一个基于SSM框架的服装商城平台的的设计与开发。实现用户从浏览服装&#xff0c;搜索服装&#xff0c;加入购物车&#xff0c;下订单&#xff0c;评论服装一整个购物流程的功能,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql…

Matter中国开发者大会实录(2022年12月2日,深圳)

目录 背景介绍 Nodic-Matter Silicon Labs-Matter Telink-Matter NXP-Matter BEKEN-Matter ESP32-Matter 背景介绍 2022年12月2日&#xff0c;Matter中国区开发者大会在深圳举行。大概有300多位开发者到会&#xff0c;我也是其中的300分之一。这次大会从早上9点半开始&a…

pybind11的Hello World

pybind11的Hello World pybind11 是用来将c的函数\类等封装为python模块的。从而在python中就可以调用C的库。 安装 pybind11是个C的header-only的库。因此无需安装&#xff0c;只需要有头文件即可。 自己新建一个C文件夹。在文件夹内将pybind作为一个外部库&#xff0c;使…

第七次更新,Spring Cloud Alibaba,迎接微服务生态的下一个十年

Spring Cloud Alibaba是什么&#xff1f; 2022年都快过完了&#xff0c;我相信大家肯定不用我说Spring Cloud Alibaba是什么了&#xff01; 近期阿里最新开源了一份&#xff0c;Spring Cloud Alibaba&#xff08;全解第7版&#xff09;&#xff0c;我大概看了一下&#xff0c…

JAMA Neurology:帕金森病跨疾病阶段的新兴神经成像生物标记物

意义&#xff1a;帕金森病(PD)的成像生物标记物在临床试验中的发病进程监测方面起到越来越重要&#xff0c;也具有改善临床护理和管理的潜力。这篇综述阐述了临床医生和研究人员需要明确在临床过程中使用的PD诊断和发病进程的成像生物标记物的时间相关性。磁共振成像(扩散成像、…

目标检测算法——人体姿态估计数据集汇总(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批人体姿态估计数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 一、KTH 多视图足球数据集 数据集链接&#xff1a…

python快速实现NPV净现值计算

净现值指未来资金&#xff08;现金&#xff09;流入&#xff08;收入&#xff09;现值与未来资金&#xff08;现金&#xff09;流出&#xff08;支出&#xff09;现值的差额&#xff0c;是项目评估中净现值法的基本指标。未来的资金流入与资金流出均按预计折现率各个时期的现值…

2023年天津仁爱学院专升本报名确认缴费考试流程

2023年天津仁爱学院专升本报名确认缴费操作流程说明及考试时间一、报名操作流程 1. 报名注册 请考生于2022年12月7日上午9点—12月11日中午12&#xff1a;00点登录报名系统https://jw.tjrac.edu.cn/zsb&#xff0c;点击“注册”按钮后进入报名登录界面&#xff0c;先请仔细阅读…

多线程学习笔记(三)

一、缓存行 缓存行&#xff1a;从缓存中读取数据是按照一块来读取的&#xff0c;这一块叫做缓存行&#xff0c;64字节大小缓存一致性协议&#xff1a;当两个数位于同一个缓存行时&#xff0c;有两个线程需要同时读取了缓存行中的数据后进行修改&#xff0c;需要和另一个线程的…

如何使用CCES来生成双核DSP的可烧写文件以及Flash Program

作者的话 之前的文章里有写到如何使用CCES来进行DSP的flash program&#xff0c;那都是单核的DSP&#xff0c;而ADI还有很多双核甚至三核DSP&#xff0c;这些DSP应该如何操作呢&#xff0c;会有哪些不同&#xff1f;我再写一个文档来说一下。 跟单核DSP一样&#xff0c;在 CC…

【测绘程序设计】——角度与弧度的转换(C#,C++,Python)

本文分享了 测绘程序设计——角度与弧度的转换(含C#、C++和Python版),相关源代码(完整工程,直接运行)及使用示例如下。 目录 Part.Ⅰ 使用示例Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅱ 代码分析Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅲ 源码下载Part…

实战YOLO V5推演(TensorRT版本 C++)

提示&#xff1a;兜兜转转还是来到了C&#xff0c;欠的债该还的得还&#xff0c;因此本篇文章试图从C来撬动tensorrt 完成转换模型和推理&#xff0c;而不是借助python库 文章目录前言一、Tensorrt前置1.1 Tensorrt基本概念1.2 异步推演说明二、实战YOLO V5推演1.TensorRT模型转…

大学电子系C++模拟考试

随手附上一些代码&#xff0c;未必是最优解&#xff0c;仅供参考。 加密四位数 【问题描述】 输入一个四位数&#xff0c;将其加密后输出。方法是将该数每一位的数字加9&#xff0c;然后除以10取余作为该位上的新数字&#xff0c;最后将千位上的数字和十位上的数字互换&#…

Prometheus 监控mysql

目录 下载安装mysqld_exporter 在mysql中创建监控用户并赋权 启动mysqld_exporter 添加到系统服务 浏览器访问服务器9104端口 在prometheus定义job来监控mysqld 运行prometheus并在端口9090上进行访问查看节点信息 根据具体需求再在可视化平台上定义数据源来进行可视化…

Java数据结构之树与二叉树

2.3 二叉树的性质&#xff08;重点&#xff0c;选择题常考&#xff09; 2.4 二叉树的链式存储 2.5 二叉树的基本操作 2.5.1 前提说明 2.5.2 二叉树的遍历 2.5.3 二叉树基本操作的实现&#xff08;重点&#xff09; 1. 树形结构 1.1 树的概念 树是一种非线性的数据结构&…

[附源码]JAVA毕业设计体检系统(系统+LW)

[附源码]JAVA毕业设计体检系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

JavaScript实现一段时间之后关闭广告

JavaScript实现一段时间之后关闭广告 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获…