Linux文件操作:open、lseek、read、write、close

1、Linux对文件的操作分为两种:
1)Linux系统提供的API; --依赖于Linux系统;
2)C标准的文件操作函数; --标准的C文件操作函数与操作系统无关;

2、文件操作方式主要是打开,读写和关闭这三种;
在Linux API中主要是使用open函数、write、read、close;

3、open有两个原形:
1)int open(const char *pathname, int flags);
2)int open(const char *pathname, int flags, mode_t mode);

参数含义:
pathname:文件路径;
flags:打开文件的标志;
mode:打开的模式;
–返回值是打开文件的句柄;

flags标志选项(部分):
O_RDONLY:以只读的方式打开文件;
O_WRONLY:以只写的方式打开文件;
O_RDWR:以读写的方式打开文件;
O_APPEND:以追加的方式打开文件;
O_CREAT:创建一个文件;
O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误;
O_NOBLOCK:以非阻塞的方式打开一个文件;
O_TRUNC:如果文件已经存在,则删除文件的内容;
O_DIRECT;

–注:O_RDONLY、O_WRONLY、O_RDWR这三个标志相互冲突,不能同时存在,只能选择其中任意一个;

mode可取值(部分):下面都是八进制的值,使用这些值的时候需要包含头文件:sys/types.h,sys/stat.h

S_IRWXU 00700 用户可以读
S_IRUSR 00400 用户可以写
S_IWUSR 00200 用户可以执行
S_IXUSR 00100 用户可以读写
S_IRWXG 00070 组可以读
S_IRGRP 00040 组可以写
S_IWGRP 00020 组可以执行
S_IXGRP 00010 组可以读写执行
S_IRWXO 00007 其他人可以读
S_IROTH 00004 其他人可以写
S_IWOTH 00002 其他人可以执行
S_IXOTH 00001 其他人可以读、写
S_ISUID 04000 设置用户执行ID
S_ISGID 02000 设置组的执行ID

4、flags标志中O_CREAT的介绍:
1)O_CREAT:该标示是为了读/写文件的I/O高度缓存开销的最小化。一般情况下,该标志会降低性能,但是,在特殊情况下,还是有作用的,例如:当应用程序使用自己的高速缓存的时候,文件I/O直接接触到用户内存,I/O操作是同步的,也就是说,一旦读/写完成,数据可以保证传输完毕;

2)使用O_DIRECT参数适合一次性写入文件内容比较大的情况,平常情况下,无需使用该标志;

3)使用了O_CREAT标志,则调用open函数的时候需要加上打开文件的模式及设置文件的用户权限;

扫描二维码关注公众号,回复: 12647544 查看本文章

4)用open函数打开文件时,如果打开成功则返回一个文件描述符,这个数值是大于0的;如果打开文件失败则会返回-1,这时使用strerror(errno)可以返回错误的描述字符串,要使用这个需要包含头文件errno.h;

5)打开文件之后,可以使用lseek函数对文件的读写指针位置定位,lseek原型如下:off_t lseek(int fd, off_t offset, int whence);
参数:
fd:打开的文件描述符;
offset:偏移量(相对于参考量);
whence:文件参考的位置,它一共有三个位置:
–SEEK_SET:文件开始,如果使用此偏移,那么文件定位到offset的位置;
–SEEK_CUR:文件读写指针的当前位置;
–SEEK_END:文件结尾;

lseek返回值是文件读写指针移动之后的位置,-1表示失败;

f_offset = lseek(fd, 0, SEEK_CUR); --取得文件当前偏移位置;

使用lseek函数移动好读写指针之后,使用read,write即可往文件里面读写数据;
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
–这两个函数比较容易看懂的了,从打开的文件,读取count个字节的数据到buf缓冲区,或是把buf缓冲区的count个字节写到文件里面去,如果没有错误,则会返回实际读/写的字节数,如果有错误码,则会返回-1;
有一种情况,返回的实际读写数目可能跟你要读写的字节数不一致,这个是没有错的,返回0表示读写的字节为0;

当我们对文件操作完成之后,需要关闭打开的文件:int close(int fd); --返回0表示关闭成功,-1表示关闭失败;

猜你喜欢

转载自blog.csdn.net/Yang_Wen_/article/details/114150201