当前位置:   article > 正文

linux文件_o_rdwr

o_rdwr

内容超多

文件系统原理及访问机制
文件在内核中的管理机制
什么是文件信息节点inode
文件的共享
文件权限,各种用户对其权限
不建议太吃力
windows如何手动修改文档
**1.打开/创建文档
2.编辑文档
3.保存文档
4.关闭文档**
实现文件创建,打开,编辑等自动化执行
操作系统提供了一系列的API 如linux系统

打开 open
读写 write/read
光标定位 lseek
关闭 close

使用open的头文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

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

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

第一个参数是指针, 指向文件的路径, 第二个参数是权限
open会返回一个文件操作符,一个小的非负整数
为了区分 read和write对文件的操作,通过文件描述符 ,其实是一个索引
每个进程打开一个文件的时候,它都会建立一个结构体来管理这些文件,文件描述符会指向这些结构体起到索引的作用
open的返回值很重要, open返回值就是文件描述符

参数说明
int open(const char* pathname, int flags); 它的返回值是一个文件描述符,
小的非负整数
int open(const char* pathname, int flags, mode_t mode);
Pathname: 要打开的文件名 (含路径,缺省为当前路径)
Flags:
O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作
以上这三个常数中应当只指定一个,下列常数是可选择的
O_CREAT若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错
O_APPEND 每次写时都加到文件的尾端
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0
Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限

文件打开操作

open

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

在这里插入图片描述
上面打开一个文件 ./file1 表示在当前路径打开file1 O_RDWR是可读可写权限
打开成功会返回一个3 也就是文件操作符,小的非负数

在这里插入图片描述
然后我们将file1删除之后,它就会返回一个负数
在这里插入图片描述
如果打开失败我们就创建它,用下面这个

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

在这里插入图片描述

open("./file1" , O_RDWR|O_CREAT, 0600);

在这里插入图片描述

open("./file1" , O_RDWR|O_CREAT, 0600);

这个代码的意思就是在当前路径下创建一个file1, 打开它的方式是可读可写
,如果没有就创建file1, 对file1的权限是可读可写

上面就没有这个file1文件,然后创建了file1的文件
文件操作权限
可读 r 4
可写 w 2
执行 x 1

0600 表示的是 2+4 =6 所以就是可写可读

文件写入操作

write

#include<unistd.h>
ssize_t write(int fd, const void *buf , size_t count);

fd文件操作符 第二个无类型指针 缓冲区, 第三个写入文件大小
将缓冲区buf指向内存中位置的数据 写count这么多的字节,写入打开的文件里面

使用write函数

在这里插入图片描述
将缓冲区buf中的数据wangyangjie 写入打开的文件中去
下面是将文件打开成功
在这里插入图片描述
file1里面的东西是 看来写入成功
在这里插入图片描述

文件读取操作

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

读文件操作所有过程
在这里插入图片描述

在这里插入图片描述
这里对fd指向的文件,读取n_write个,放到buf中去,因为n_write表示是写入多少个
因为readbuf是指针,所以要开辟空间,开辟的是读出多少个的空间也就是写入的
这里显然是读取失败了,因为光标问题

在这里插入图片描述
我们在写入数据的时候,光标定位在数据的最后,所以读取是从光标后面开始读取的所以我们有两种办法
第一种办法 是关闭文件重新打开
也就是在写入文件操作之后关闭文件重新打开
在这里插入图片描述

第二种办法是光标移动操作

光标移动操作

将文件读写指针相对whence移动offset个字节

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

SEEK_SET 指向文件头
The file offset is set to offset bytes.
文件偏移量设置为偏移字节
SEEK_CUR 指向当前光标位置
The file offset is set to its current location plus offse bytes.
文件偏移量设置为其当前位置加上偏移字节。
SEEK_END 指向文件尾巴
The file offset is set to the size of the file plus offset
bytes.
文件偏移量设置为文件大小加上偏移量字节。
在这里插入图片描述
通过上面lseek这个函数 将光标移动了回去
在这里插入图片描述

结果也顺利显示了出来

在这里插入图片描述
用这个也可以将光标定位
在这里插入图片描述
结果也是可以

如何计算文件大小 lseek

在这里插入图片描述
结果就是如下图所示
在这里插入图片描述
O_CREAT 若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错

我们已经文件存在了,使用O_EXCL权限
在这里插入图片描述
文件会出错返回-1, 所以结果就是打开文件失败
O_APPEND 每次写时都加到文件的尾端 这又是什么意思呢
比如我们正常给文件写入东西的时候,我们原来文件如果是有东西的,那么我们就会把原来文件的东西给覆盖到,如果加上O_APPEND那么就会另起一行追加到后面去
我们首先看file1文件里面是12345678
在这里插入图片描述
然后对文件里面写入东西 wangyangjie12345678
在这里插入图片描述
我们会发现原来文件的内容被覆盖掉了
在这里插入图片描述
我们在打开的时候加上O_APPEND
在这里插入图片描述
我们可以看到原来的东西还在,它会自动在后面写入东西,而不会导致原来的东西被覆盖掉

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/182947
推荐阅读
相关标签
  

闽ICP备14008679号