Linux学习笔记之四(文件IO、目录IO)

news2024/11/24 12:01:13

Linux

  • 1、文件IO
    • 1.1、open and close
    • 1.2、read and write
    • 1.3、lseek
    • 1.4、综合练习
  • 2、目录IO
    • 2.1、mkdir
    • 2.2、opendir, closedir, readdir
    • 2.3、综合练习

1、文件IO

1.1、open and close

使用以下代码查看以下open函数原型:

man 2 open

在这里插入图片描述
如图,open函数有两个原型,分别是:

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

其中

pathname:文件所在的路径。
flag:文件给用户的权限。
mode:对新创建的文件赋予的权限。
返回值:一个文件描述符,以整数的形式体现,成功打开则返回3,4,5其中一个,失败则返回-1。

flag的参数有以下这些,可以用" | "(或逻辑)同时选择多个。当选择到O_CREAT的时候,必须添加第三个参数mode。下面这些参数具体意义还得查看手册(manual)。

必选:O_RDONLY, O_WRONLY, O_RDWR
可选:O_CLOEXEC, O_CREAT,  O_DIRECTORY,  O_EXCL,  O_NOCTTY,  O_NOFOLLOW,  O_TMPFILE

mode参数一般是四位数,第一位数表示八进制(不管它,输入0即可)。后面三位数分别表示用户权限,同组用户权限,其他用户权限。用rwx表示权限,然后1/0表示是否开启该权限,最后将其组合转化为八进制。如下:

rwx: read write execute
111(rwx)->7,110(rw-)->6....(二进制转换)

0000(000 000 000: --- --- ---)
0001(000 000 001: --- --- --x)
0002(000 000 010: --- --- -wx)
...
0777(111 111 111: rwx rwx rwx)

但所创建的文件真实的权限还要和umask码取反后相与,可以输入umask查看其具体值:
在这里插入图片描述
最后是close函数,就相对非常简单多了。把open返回的文件描述符号作为输入参数即可。

close(fd);
note: fd is a file descriptor 

1.2、read and write

先查看以下函数原型:

man 2 read

在这里插入图片描述
如图,其函数原型是:

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

fd:文件描述符。
*buf:指向读取的内容的指针 。
count:要读取的字节数 。
返回值:如果读取成功,则返回读取的字节数目。如果失败,返回-1;如果正常读取,但没读取到东西,返回0。

再来看看write函数。依旧先看manual。

man 2 write

在这里插入图片描述
函数原型是:

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

fd:文件描述符。
*buf:指向写入缓冲区的内容的指针 。
count:要写入的字节数 。
返回值:如果写入成功,则返回写入的字节数目。如果失败,返回-1;如果正常写入,但没写入任何东西,则返回0。

注意的地方:

  1. 如果write的第一个参数是为1,则意为把缓冲区的东西写入终端,而非写入文件。

1.3、lseek

老生常谈,先看一些它的函数说明。

man 2 lseek

在这里插入图片描述
可以看出,其函数原型是;

off_t lseek(int fd, off_t offset, int whence);

fd:文件描述符。
offset:指针偏移的量 。
whence:指针偏移的基准位置。(可选的参数有:SEEK_SET, SEEK_CUR, SEEK_END…)
返回值:如果写入成功,则返回所指向的字节数。如果失败,则返回-1。

这里有几个点需要说明:

  1. 无论是ssize_t,还是off_t之类的,其实都属于整形数据。所以在一般情况下,把他们当整形用即可。
  2. 文件的读写操作都是依靠指针的偏移来确定位置的。譬如当你读完或写完N个字节,该指针也会随之偏移到第N位去,直到文件被close指针才复位。
  3. 默认打开文件的时候,文件指针指向定0个字节。

1.4、综合练习

  • 练习任务:
    • 在“/home/yuquan”下创建并打开一个test.c文件
    • 往该文件写入“writing successfully!”的字符串
    • 将该字符串读取并打印出来。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
	char buf_read[21] = {0};

	int fd = open("/home/yuquan/test.c",O_RDWR|O_CREAT, 0777);
	
	write(fd, "writing successfully!\n", 22);
	
	lseek(fd,-22,SEEK_CUR);		//让指针从新指向文件开头
	
	read(fd, buf_read, 21);

	printf("the string you read is:%s\n",buf_read);

	close(fd);
	
	return 0;
}

上面这段代码去掉了很多检查报错冗余代码,一般来说不建议这样写,而是像下面这样写好些。
在这里插入图片描述

2、目录IO

2.1、mkdir

查看函数说明:

man 2 mkdir

在这里插入图片描述
可以看到函数原型是:

int mkdir(const char *pathname, mode_t mode);

*pathname:将被创建的文件所在的目录。
mode:给该文件的权限,参考文件IO小节的open中的mode,原理是一样的。
返回值:成功返回0,失败返回-1。

2.2、opendir, closedir, readdir

opendir的函数说明在manual第三页,所以应该输入以下指令来查找。

man 3 opendir

在这里插入图片描述
可以看到函数原型有两个,分别是:

DIR *opendir(const char *name);
DIR *fdopendir(int fd);

name:文件的名称(包含路径)。
fd:文件的描述符,配合文件IO中的open函数使用。
返回值:如果正确打开文件,则返回一个文件流指针,反之返回NULL。

文件流指针是一个指向文件的指针,在初始时刻,它指向的是打开该文件夹之后的第一个文件。
接着,再来看看closedir函数:

man 3 closedir

在这里插入图片描述

DIR *dirp:目录流指针。
返回值:成功返回0,失败返回-1。

最后说一下readdir

man 3 readdir

在这里插入图片描述
函数原型是:

struct dirent *readdir(DIR *drip);

DIR * dirp:文件流指针。
返回值:成功读取返回一个结构体,失败返回NULL。

readdir函数读完一个文件之后,文件流指针会接着往下偏移,直到该文件夹里的所有文件被读取完毕且返回NULL。接着细说一下这个结构体,从使用手册可以看出它的结构长这样:

struct dirent {
   ino_t          d_ino;       /* inode number */
   off_t          d_off;       /* not an offset; see NOTES */
   unsigned short d_reclen;    /* length of this record */
   unsigned char  d_type;      /* type of file; not supported
                                  by all filesystem types */
   char           d_name[256]; /* filename */
};

比较重要的参数有以下两个,其中的d_ino指的是文件的编号,比如我输入ls -i之后看到的数字:
在这里插入图片描述

d_name[256]指的是所读文件的名称,比如下面这些:
在这里插入图片描述

2.3、综合练习

  • 练习任务:
    • j键盘输入一个目录,并且将该目录中的所有文件都打印到终端里来。
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int mian(int argc, char *argv[])
{
        struct dirent *temp;
        if(argc != 2)
        {       
                printf("using:%s <directory name>\n",argv[0]);
        }
        DIR *drip = opendir(argv[1]);
        int i = 0;
        while((temp=readdir(dirp)) != NULL)
        {
                i++;
                printf("the %d file name is: %s \n",i,temp->d_name);
        }
        
        return 0;
}

注意:遍历文件只能有一个层级,不能遍历文件中的文件。因为文件流指针只指向该文件的下一层级。

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

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

相关文章

测试开发角色定位

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

python opencv 实现对二值化后的某一像素值做修改和mask叠加

实现对二值化后的某一像素值做修改 使用OpenCV的findNonZero函数找到所有非零&#xff08;也就是像素值为255&#xff09;的像素&#xff0c;然后遍历这些像素并修改他们的值。示例代码&#xff1a; import cv2 import numpy as np # 加载并二值化图像 img cv2.imread(…

实验七 组合器模式的应用

实验目的 1)掌握组合器模式&#xff08;composite&#xff09;的特点 2 分析具体问题&#xff0c;使用组合器模式进行设计。 实验内容和要求 在例3.3的设计中&#xff0c;添加一个空军大队( Wing)类&#xff0c;该类与Squadron、Group类是平行的&#xff0c;因此应该继承了AirU…

【聚沙成塔系列】通信笔记知识汇总一

什么是NCO 载波NCO通过控制频率w控制。每次要累加的数字M就是频率控制字。调节M进而控制载波频率。 什么是带宽 3db带宽 常说的3dB带宽&#xff0c;是指在信号功率谱对称的情况下&#xff0c;功率谱密度比信号频谱中心处的峰值下降3dB的两个频率之间的频率范围 工作带宽 工作…

十年老程序员分享13个最常用的Python深度学习库和介绍,赶紧收藏码住!

文章目录 前言CaffeTheanoTensorFlowLasagneKerasmxnetsklearn-theanonolearnDIGITSBlocksdeepypylearn2Deeplearning4j关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…

什么是本地存储的有效期?

前言 本地存储是一种在Web开发中常用的客户端存储数据的方式&#xff0c;它可以让网页应用程序在用户的浏览器中存储和检索数据&#xff0c;而无需依赖服务器来保存信息。本地存储的有效期是指数据存储在用户的设备上可以被访问和保留的时间段。在本地存储中&#xff0c;有两种…

7 mysql索引

1、索引的本质 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 2、InnoDB支持常见的索引 B树索引、 全文索引、 哈希索引&#xff0c; 其中比较关键的是B树索引 3、HashMap不适合做数据库索引&#xff1f; 1.hash表只能匹配是否相等&#xff0c;不…

高数笔记06:无穷级数

图源&#xff1a;文心一言 时间比较紧张&#xff0c;仅导图~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武忠祥 &#x1f433;目录 &#x1f433;常数项级数 &#x1f40b;概要 &…

ABAP Json和对象的转换

se24新建类ZCL_JSON保存 点击修改&#xff0c;进入下图界面&#xff0c;点击红框。 复制粘贴下面代码 CLASS zcl_json DEFINITIONPUBLICCREATE PUBLIC .PUBLIC SECTION. *"* public components of class ZCL_JSON *"* do not include other source files here!!!TYP…

效率至少提高2倍!最实用的Linux命令合集

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

上门预约按摩家政小程序开发;

上门预约按摩家政小程序开发&#xff0c;都可以做 上门按摩&#xff0c;服务预约小程序开发 服务预约类小程序开发。 小程序开放订单预约、即时服务、在线评价用户管理、会员充值、平优惠券、、平台自营、抢单、事个人入驻、分销邀请、商户入驻 等等 按摩上门预约、回收上门预约…

CSS默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…

【数据结构】——顺序表(增删查改)

目录 前言&#xff1a; 顺序表&#xff1a; 1、概念及分类 1.1顺序表分类 静态顺序表 动态顺序表 2、接口实现 2.1功能要求 2.2功能实现 &#x1f4a1;初始化顺序表 &#x1f4a1;销毁顺序表 &#x1f4a1;顺序表尾插入 &#x1f4a1;检查是否扩容 &#x1f4a1;…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

Python点云处理(十九)点云地面点提取——CSF布料模拟算法

目录 0 简述1 算法原理2 具体步骤3 实现0 简述 对于点云地面点滤波,众多传统算法滤波效果容易受到地形特征的影响(通常在复杂场景及陡峭地形区域滤波效果较差)且常常需要用户对数据有较为丰富的先验知识来进行设置滤波器中的各种参数。为了解决这些问题,张吴明教授等人提出…

Allegro如何快速将目标旋转90度操作指导

Allegro如何快速将目标旋转90度操作指导 在用Allegro进行PCB设计的时候,时常需要目标旋转90度,我们常用的命令是Spin,如下图以旋转电阻为例 点击Edit点击SpinOp

数据结构初阶---复杂度的OJ例题

复杂度的OJ例题 一、消失的数字1.思路一2.思路二3.思路三 二、旋转数组1.思路一2.思路二3.思路三 一、消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(N)时间内完成吗&#xff1f; 链接&#xff1a;力扣&…

用「埋点」记录自己,不妄过一生

最近有朋友问我「埋点怎么做」&#xff0c;给朋友讲了一些互联网广告的案例&#xff0c;从源头的数据采集讲到末尾的应用分析和流量分配等&#xff08;此处省略N多字&#xff09; 解释完以后&#xff0c;我想到一个问题&#xff1a;有了埋点可以做分析&#xff0c;那我们对自己…

尚硅谷大数据项目《在线教育之实时数仓》笔记006

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P041 P042 P043 P044 P045 P046 P047 P048 P049 P050 P051 P052 第9章 数仓开发之DWD层 P041 9.3 流量域用户跳出事务事实表 P042 DwdTrafficUserJum…

Android岗位居然要求有鸿蒙开发的需求了?HarmonyOS它来了

鸿蒙才开发几年,就已经让对手们脊背发凉了&#xff0c;要知道主流操作系统都是积累几十年的产物。 以苹果MacOS为例,其前身NextStep是85年开干的。另一家微软公司,Win95爆卖的时候,中国还没加入WTO。 大家使用过鸿蒙系统产品的,应该能直观感觉到它的流畅性,易用性,如果你有个…