1、open函数
#include<stdio.h> #include<unistd.h> //close函数头文件 #include<sys/types.h> //open函数头文件 #include<sys/stat.h> //open函数头文件 #include<fcntl.h> //flags参数头文件 //返回值为对应文件的描述符,打开失败返回-1 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); //参数 pathname为文件路径 //参数 flags为文件操作权限 //参数 mode为当文件被创建时,附加文件的初始分为权限 rwx
详细使用可以使用Linux命令:man 2 open
flags参数:(注意这里可以使用 |来添加多个参数),如:
int fd = open("./test.txt",O_RDWR | O_CREAT, 0644); close(fd);
flags三个访问权限参数:(注意这三个参数在flags中只能出现其中一个)
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
flags其他参数:
O_CREAT:若文件不存在则创建它。
补充:需要同时使用open的第三个参数mode,为新文件添加访问权限。
O_EXCL:在使用O_CREAT参数创建文件,而文件已经存在时报错。
O_APPEND:将新写入的数据放到文件的末尾,不会覆盖前面已有的数据。
O_TRUNC:它表示以截断的方式打开文件。当以O_TRUNC标志打开文件时,如果文件已经存在,那么文件的内容会被清空;如果文件不存在,那么会创建一个新的空文件。
mode参数:
表示设置文件访问权限的初始值,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,具体情况可以百度 或者 man 2 open命令
注意点:创建权限时,受当前进程的umask影响,
具体情况为:最终权限 = mode & ~umask
查询当前进程的umask的方法:直接运行命令(umask)
例如umask输出002则~umask为775,然后mode会和775进行&运算,
即使你输入的是0777,那么最终的权限也会是775
2、read和write函数
#include<unistd.h> //失败均返回-1 ssize_t read(int fd, void *buf, size_t count); size_t write(int fd, const void *buf, size_t count);
fd参数:文件描述符
buf参数:缓冲区,用于存放接受的数据或者需要写入的数据。
(注意:buf是一个指向字符数组的指针,所以不能用指针代替数组)如:
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<iostream> using namespace std; int main(int argc,char *argv[]){ int fd1; fd1 = open("./openfile.txt", O_RDWR); printf("fd1 = %d\n", fd1); int fd2; fd2 = open("./copytest.txt", O_RDWR | O_CREAT | O_TRUNC, 0777); char buf[1024];//这里只能用数组,而不能用 char *buf int size_re=0; while((size_re=read(fd1,buf,1024))!=0){ cout<<size_re<<endl; write(fd2,buf,size_re); } close(fd1); close(fd2); return 0; }
count参数:
read:缓冲区的大小
write:写入数据的大小文章来源:https://www.toymoban.com/news/detail-612132.html
记录:因为很少用文件函数,所以在一次线下面试的过程中,对方让我手写一个读文件的函数,我直接呆住了,我知道open和read函数,但是让我用手写瞬间就呆住了,不知道怎么下手,可能是太紧张的问题,10秒后我放弃了,可是手写函数真的很呆啊,那些参数我记不得哇。<-.->!文章来源地址https://www.toymoban.com/news/detail-612132.html
到了这里,关于Linux-open、read、write函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!