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

这篇具有很好参考价值的文章主要介绍了[Linux打怪升级之路]-文件操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器作者:小蜗牛向前冲

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器名言:我可以接受失败,但我不能接受放弃

如果觉的博主的文章还不错的话,还请int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

目录

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

1、什么是文件

2、文件的类型

3、文件的共识

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

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

2、其他的文件接口

3、代码演示文件操作 


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

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

1、什么是文件

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

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

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

为什么这么说的呢?

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

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

2、文件的类型

普通文件

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

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

目录文件

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

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

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

3、文件的共识

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

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

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

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

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

文件打开open

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

 头文件:<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;
}

 int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

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

flags多个选项:

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

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

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

返回值

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

文件关闭 close

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

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

2、其他的文件接口

read读文件

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

函数原型:

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

参数 

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

 write写文件

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

函数原型:

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;
}

int fd = open(log_filename, o_rdwr,Linux的学习日常知识,linux,运维,服务器

 这里观察到我们成功向文件中写入和向文件中读取数据。文章来源地址https://www.toymoban.com/news/detail-789389.html

到了这里,关于[Linux打怪升级之路]-文件操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++从零开始的打怪升级之路(day12)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天学习了关于模板的知识,下面展开分析 首先我们思考一个问题,如何是实现一个通用

    2024年01月22日
    浏览(41)
  • C++从零开始的打怪升级之路(day13)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天学了一些基础的string的函数,刷了一些题,等string学完了再总结语法,函数 把字符串

    2024年01月20日
    浏览(32)
  • C++从零开始的打怪升级之路(day19)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 137. 只出现一次的数字 II 给你一个整数数组  nums  ,除某个

    2024年01月25日
    浏览(45)
  • C++从零开始的打怪升级之路(day11)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 为了巩固前面的知识,最近更新刷题贴,C++进度暂缓 反转字符串中的单词 III  由于还没学

    2024年01月18日
    浏览(38)
  • C++从零开始的打怪升级之路(day20)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 260. 只出现一次的数字 III 给你一个整数数组  nums ,其中恰

    2024年01月25日
    浏览(41)
  • <Linux> 基础IO(文件操作、文件描述符fd、重定向)

    1、空文件也要在磁盘占用 我们创建的文件,虽然里面并没有存放数据,但是文件属性也是数据,即便你创建一个空文件,也要占据磁盘空间 2、文件 = 文件内容 + 文件属性 文件内容就是真正写入的内容,文件属性就是文件名、文件大小、文件的权限、拥有者所属组…… 3、文

    2024年02月03日
    浏览(46)
  • 【Linux】文件描述符 - fd

    使用 man open 指令查看手册: open 函数具体使用哪个,和具体应用场景有关。如:目标文件不存在,需要 open 创建,则第三个参数表示创建文件的默认权限;否则使用两个参数的 open。 write read close lseek ,类比 C 文件相关接口。 操作文件,除了使用 C 语言的接口【Linux】回顾

    2024年03月23日
    浏览(39)
  • Linux - fd文件描述符和文件详解

                                                      ​​​​​​​             ​​​​​​​                                                   感谢各位 点赞 收藏 评论 三连支持                                                 本文

    2024年02月08日
    浏览(47)
  • Linux--文件描述符fd的本质

        

    2024年02月16日
    浏览(40)
  • 【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:了解在Linux下的系统文件IO,知道什么是文件描述符,什么是重定向 毒鸡汤:白日莫闲过,青春不再来。 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 最早我们在C语言中学习关于如何用代码

    2024年04月14日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包