Linux-open、read、write函数

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:写入数据的大小

记录:因为很少用文件函数,所以在一次线下面试的过程中,对方让我手写一个读文件的函数,我直接呆住了,我知道open和read函数,但是让我用手写瞬间就呆住了,不知道怎么下手,可能是太紧张的问题,10秒后我放弃了,可是手写函数真的很呆啊,那些参数我记不得哇。<-.->!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值