沈雅

努力,以不负沈雅之名!
嵌入式、Linux、Cosplay、Acg、动漫、各种文学 全为我所爱矣!
交流联系:QQ88459122

Linux基础编程-文件操作open,lseek,read,write,close

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表示关闭失败。

 

一个简单的例子:

[cpp] view plaincopy

  1. #include <stdio.h>  

  2. #include <string.h>  

  3. #include <sys/types.h>  

  4. #include <sys/stat.h>  

  5. #include <fcntl.h>  

  6. #include <errno.h>  

  7. ///////////////////////////////////////////////////////////  

  8. int main(int argc, char **argv)  

  9. {  

  10.     int fd;  

  11.     long fpos;  

  12.     fd = open("open_file_test", O_RDWR | O_CREAT, 0644);  

  13.     if (fd == -1)  

  14.     {  

  15.         printf("open file open_file_test failed!/n%s/n", strerror(errno));  

  16.         return -1;  

  17.     }  

  18.       

  19.     printf("open open_file_test ok!/n");  

  20.     fpos = lseek(fd, 0, SEEK_END);  

  21.     if (fpos == -1)  

  22.     {  

  23.         printf("lseek failed!/n%s/n", strerror(errno));  

  24.         close(fd);  

  25.         return -1;  

  26.     }  

  27.     printf("file size:%ld/n", fpos);  

  28.     close(fd);  

  29. }  

 


评论

© 沈雅 | Powered by LOFTER