打开(open)
使用open函数需要包含以下三个头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
open的函数定义格式
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
函数定义的参数解读
1.pathname:指向文件的路径
指定文件格式:./文件夹名字/指定文件名字
当前文件格式:./当前文件名字
2.flags:文件权限(分为两种情况)
第一种:(只能选择并执行其中一个)
1、O_RDONLY 只读打开
2、O_WRONLY 只写打开
3、O_RDWR 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。以上这三个常数中应当只指定一 个。
第二种:(可以选择多种同时进行)
注:在执行第二种时,其格式是与第一种并在一起,两者中间需要加一个 '|'
1.O_CREAT:若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。结构如下:(最后一部分代码可为此做展现)
fd = open("./file1",O_RDWR|O_CREAT,0600);//fd为open的文件描述符,如果没有该文件,则创建一个新的文件并打开
2.O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错(返回-1)。结构如下:
fd=open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);//fd为open返回的文件描述符,此时若已经存在file1,open返回-1
代码示例:
int main()
{int fd;fd = open("./file1",0 RDWRIO_CREATIO_EXCL,0600);if(fd == -1){printf("file cunZai\n");}return 0;
}//文件已经存在则会出错 返回值为-1 再针对-1做出验证
3.O_APPEND:每次写时都加到文件的尾端。结构如下:
fd=open("./file1",O_RDWR|O_APPEND);//此时可将原file1文件里的信息保留后再从尾部写入
代码示例:
int main()、
{int fd;char *buf = "Hello Word";fd = open(" ./file1",0_RDWR|O_APPEND);printf("open susceess : fd = %d\n",fd);int n_write = write(fd,buf,strlen(buf));if(n_write != -1){printf("write %d byte to fileln",n_write);}close(fd);return 0;
}//原先在文件里写入123456 执行上述代码后会在原先里面的123456后输出Hello Word
4.O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。结构如下:
fd=open("./file1",O_RDWR|O_TRUNC);//此时可将原file1文件里的信息先删除后写入
int main()、
{int fd;char *buf = "Hello Word";fd = open(" ./file1",0_RDWR|O_TRUNC);printf("open susceess : fd = %d\n",fd);int n_write = write(fd,buf,strlen(buf));if(n_write != -1){printf("write %d byte to fileln",n_write);}close(fd);return 0;
}//原先在文件里写入Hello Word,执行上述代码后文件会将原先里面的Hello Word替换成test
3.mode
mode是文件的创建模式,其执行功能有5种,分别是:
可执行:0100
可写:0200
可读:0400
可读、写:0600
可读、可写、可执行:0700
读的符号是r,数值为4;写的符号是w,数值为2;执行的符号是x,数值为1。其中共有4位数,而mode的创建模式执行的功能取决于第2位的数值(几种数值本身的数或者和)。对0600解析即:文件的所有者(用户)对文件file1的权限。
注:mode一定是在flags中使用了O CREAT标志,mode记录待创建的文件的访问权限。
文件描述符
执行一个程序时可能会打开很多文件,而对多个文件的操作需要进行区别,我们需要指定某个文件进行指定操作,这个时候就需要一个区分标志来辨别,即文件描述符。当一个文件被打开时,系统会产生一个结构体来储存文件中的各种信息,此时文件描述符指向这些信息。同时open函数的返回值就是一个文件描述符,其返回值是一个较小的非负整数。
代码展示
文件存在:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main()
{int fd;//定义一个文件描述符fd = open("./file1",O_RDWR);//open函数的返回值给文件描述符printf("fd = %d\n",fd);//输出文件描述符的值return 0;
}
文件不存在:
创建(creat)
与open函数一样需包含以下三个头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
creat的函数定义格式
int creat(const char *pathname,mode_t mode);
示例:
fd = creat("/home/CLC/file1",S IRWXU);//指定路径创建文件 并赋予权限
fd = creat("./file1",S IRWXU);//当前路径创建文件 并赋予权限
与open函数一样,返回值也是文字描述符。返回值也是一个较小的非负整数。
函数定义的参数解读
1.pathname:指向文件的路径
2.mode
mode是文件的创建模式,这里与open函数的mode有区别,这里的创建模式为系统自带。
可执行:S_IXUSR
可写:S_IWUSRL
可读:S_IRUSR
可读、可写、可执行:S_IRWXU
代码展示
结合open函数:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main()
{int fd;fd = open("./file1",O_RDWR);//此时文件已经不存在if(fd == -1)//文件不存在输出小于零的负数{printf("open file1 failed\n");//提示文件打开失败fd = open("./file1",O_RDWR|O_CREAT,0600);//创建一个可读可写可执行的文件if(fd > 0)//输出非负整数{printf("creat file1 success\n");//提示创建成功并打开}}return 0;
}
可见删除file1之后用该函数可以再次创建并打开。