Linux基础编程-文件操作open,lseek,read,write,close
Linux上面对文件的操作可以分为两种:1.Linux系统提供的API; 2.C标准的文件操作函数。
前者依赖于Linux系统,后者是标准的C文件操作函数与操作系统无关。
文件操作方式主要是打开,读写和关闭这三种。
在LinuxAPI之中主要是使用open函数,write,read,close。
open有两个原形:
int open(const char *pathname, int flags);
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_RDONLY、O_WRONLY、O_RDWR三个标志只能使用任意的一个。
如果flags中使用了O_CREAT标志,则调用open函数的时候需要加上打开文件的模式,设置文件的用户权限
int open(const char *pathname, int flags, mode_t mode);
下面是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
呵呵,这个跟chmod命令中的后面的值差不多,个人比较喜欢用数值来代替,
用八进制数据表示为0777等,其中4:读权限,2:写权限,1:可执行权限,0:无权限,每一位的值可以取其中的一位或是它们的组合
从最低位开始分别对应的权限是:其它用户权限,组权限,当前用户权限。
open函数打开一个文件,如果打开成功则返回一个文件描述符,类似于文件句柄吧,这个数值是大于0的,
如果打开文件失败则会返回-1,这时使用strerror(errno)可以返回错误的描述字符串,要使用这个需要包含头文件errno.h
打开文件之后,可以使用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);
文件大小可以通过下面: f_len = lseek(fd, 0, SEEK_END);
使用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表示关闭失败。
一个简单的例子: