文件操作函数
open(),read(),write(),close(),lseek()
O_RDONLY 文件为 只读
O_WRONLY 文件为 只写
O_RDWR 文件为 可读可写
O_APPEND 文件为 可追加
O_CREAT 在没有文件的时候创建
O_TRUNC 当文件存在且为可读或可写状态时 清空已存在内容
O_EXCL:如果同时和O_CREAT使用,而文件已经存在,则会出错,不存在则创建文件。
以上七个文件打开方式 较常用 其他标志可自己查询man手册
函数详解
1.open()
由linux man手册可查询文件open函数的用法
open()
pathname 为文件所在位置即路径 如有文件file1.txt 在/tmp/file/file1.txt
flags 为文件打开方式
mode 为文件权限 //后续会补充说明
所需头文件:
#include<syts/types.h>
#include<sys/stat.h>
#include<fcntl.h>
返回值
成功:返回值为文件描述符(一般非0)
失败:返回值为-1
```c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
1.int open(const char *pathname,int flags);
用于现存文件的打开,pathname为文件路径(包含文件名)
flags 为文件打开的方式
比如开头介绍的五种方式,注意O_CREAT 一般用于函数(2)
2.int open(const char *pathname,int flags,mode_t mode);
pathname 和 flags 同函数(1),唯一不同的是,函数(2)一般用于未有文件的打开方式
mode 可理解为 赋予文件的权限 为unsigned int 类型 四字节,
比如 值可为0600
0表示八进制
6表示文件可读可写 6的二进制数为0110 第一位权限总是为0 第一个1为可读 第二1表示可写
所以0600表示 文件用户有可读可写权限
2.read()
read()
fd 同样为文件标识符
buf 为无类型指针 一般用于是字符串信息
count 是读取的字节数
所需头文件:
#include<unistd.h>
返回值:
成功:返回读取实际数据大小
失败:返回-1
解释:
从文件标识符为fd的文件中,读取长达count字节的数据存储到buf所指位置
3.write()
write()
fd 为文件标识符
buf 为某个已经存储有信息的数据 一般都为字符串
count 为buf的大小 单位为字节(byte)
所需头文件:
#include<unistd.h>
返回值:
成功:返回值为实际写入打的数据大小
失败:返回值为-1
解释:
向标识符为fd的文件中,写入大小为count的数据,内容为buf所指内容
4.close()
close()
fd为文件标识符,即可以理解为open函数成功时的返回值
成功:返回值为0
失败:返回值为-1
上述函数代码演示
上述代码
第一次 运行时 打开 提示"文件不存在"
第一次并没有文件 在创建文件之后
第二次 运行时 打开 提示"文件打开成功"
5.lseek()
在上述四个函数的代码演示之中,我们发现在我们使用write()函数之后,用 read()函数之前,我们先用了close()函数关闭文件,然后调用open(),最后才是read()函数。这是为什么呢?是代码多写了?还是有其他原因?
通过写代码 (这个自己尝试,可以先去掉close,直接read 看看什么结果),我们发现,若在write()之后,read()之前,我们没有用close(),会读取文件为空(’\0’)或者出现读取文件错误。我们发现, 文件的光标在数据的最末端(’\0’),而使用close()之后,再打开再读取文件,发现文件的光标在数据开始端,所以这就是先close 后 read 的原因!
每次读写完都要close open 文件,再下一步操作,这样不仅繁琐,还使代码冗杂,在这里介绍一个新函数 lseek()
lseek()
fd:操作的文件的的文件描述符;
offset:偏移量
flag:移动标记,有以下几种:
SEEK_SET:将该文件的偏移量设置为距文件开始处offset个字节;
SEEK_CUR:将该文件的偏移量设置为当前值加offset个字节;
SEEK_END:将该文件的偏移量设置为文件长度offset个字节;
返回值:
成功:返回值为偏移量大小
失败:返回值为-1
代码演示
总结
通过以上对五个文件常用操作函数的展示,想必大家对文件操作有了基本认识,对于open()函数有几个 flags 没有用到 比如O_TRUNC 、O_EXCL等,大家可以根据解释自行写代码实际操作。除此之外,学会使用 linux下 man 手册查询函数,获得更多函数的 用法和关键指令。
增强编程能力,光看不行,动手最关键,最后总结出一片文章记录自己的学习过程。