C语言文件IO复习总结

  • Post author:
  • Post category:其他


在Linux操作系统中,万物皆文件(everything is file),而今天进行复习的就是文件I/O,文件I/O基于POSIX标准,在进行文件I/O的过程中,每一次操作都会进行系统调用,增加大量系统开销,而我们后面讲到的标准I/O就大大弥补这一个缺陷。

首先我们从最基础的

open

函数开始:

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

pathname :文件名或者路径名。

flags:文件打开方式。

mode:文件存取权限。

下面我们一一的来说明这些参数:

文件名和路径名需要放在” “中,举个例子open(“hello.txt”)

一个文件有多个文件打开方式,这些flag参数可以通过”|”操作组合在一起,下面列出几个常见的flag参数:


O_RDONLY,O_WRONLY,O_RDWR

,这三个参数不能相互组合。


O_RDONLY

:表示以只读方式打开文件,类似于标准I/O中的”r”权限。


O_WRONLY

:表示以只写方式打开文件,类似于标准I/O中的”w”权限。


O_RDWR

:表示以读写方式打开文件,类似于标准I/O中的”r+”权限。


O_CREAT

:表示如果打开文件不存在,就创建一个新文件。


O_EXCL

:表示如果使用

O_CREAT

时目标文件存在,则返回错误信息。可以用于测试目标文件是否存在。


O_TRUNC

:表示使用

O_CREAT

时文件已存在,清空文件中所有数据,并且在设置文件大小为1。


O_APPEND

:表示使用

O_CREAT

时文件已存在,把要写入的数据添加进文尾(文件读写位置自动指向文尾)。

使用man手册可以查看剩下的flag参数,在这不做赘述。

mode是文件存储权限,可以用宏定义的方式表示,也可以用八进制的方法表示,类似0666,换成二进制就是:

|0110(文件所有者的权限)|0110(文件所在用户)|0110(其他用户)|

|w,r,x|w,r,x|w,r,x|

后三位代表着读w,写r和可执行权限x,所有权限都有就是0777。

注意,我们最后看到的文件权限还要再经过一道步骤,文件权限掩码,umask。

(mode & ~umask)这样子才是最后我们看到的文件权限,在Linux终端下输入umask查看当前文件掩码,一般是八进制0002。终端下输入umask+八进制数字可以修改,但是注意,这样修改的文件掩码只在该终端上修改,如果重启或者开其他终端,umask恢复初始值。


open

函数成功返回文件描述符,失败返回-1。返回的文件描述付是int型。


close

函数用于关闭一个已经打开的文件。一般我们在完成对文件操作后,添加

close

函数。

close(文件描述符);成功返回0,失败为-1。

下面介绍下如何在终端修改文件权限,使用

chmod

函数来修改

int chmod(const char *path, mode_t mode);

和open函数类似,第一个参数也是文件名,也可以是路径名,mode也和open函数中mode类似,可以用宏定义或者八进制的方式去写。

下面写一个简单的open函数:

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

int main(int argc,char *argv[])
{
        int fd;//文件描述符
        fd=open("test.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
        //以读写,不存在就创建,存在就清空的方式打开test文件
        if(-1 == fd)
        {
            perror("open");
            exit(-1);
        }
        close(fd);//关闭文件描述符
        return 0;
}

写在最后:

这是我的第一篇博客,写的不好还望多多指正。



版权声明:本文为weixin_42248825原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。