Linux中,关于open()打开,read()读取,write()写入的函数操作,复习必备!

本文介绍了Linux中的open函数,用于打开或创建文件,以及write和read函数用于文件的读写操作。open函数的参数包括文件路径、访问模式和创建模式。write函数将数据写入文件,read函数从文件读取数据。同时提到了lseek函数用于改变文件读写位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 操作系统中,open 函数是一个 Linux 系统调用,用于打开一个文件或者创建一个新文件 ,加上配合write() 和 read() 函数的使用来方便我们对文件的读写操作,下面我们来看看他们的作用以及函数原型:

open()函数:

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

其中,pathname 参数是要打开或创建的文件的路径:

文件路径名(绝对路径)或者文件名

flags 参数指定文件访问模式和打开方式:

只读:O_RDONLY 、只写:O_WRONLY、可读可写:O_RDWR

我们可以与上另外一些可选常量,使用不同的功能函数:如

O_RDWR | O_CREAT:可读可写且当打开这个文件时,该文件不存在则创建它

O_CREAT:当打开这个文件时,该文件不存在则创建它,需要搭配第三个参数使用

O_APPEND:每次往这个文件写新的内容时,新的内容总是加到文件的末端即打开文件后进行写操作时(调用write()),若该文件原先有内容,则不会覆盖原来的内容,而是在末端添加内容

O_TRUNC:清空原本的内容

O_EXCL:若同时与上该常量与 O_CREAT,当需要打开的文件存在时,open()会返回一个整型数-1

mode_t mode:参数是新创建文件的访问权限,该函数返回一个整型的文件描述符,表示打开文件的位置。如果打开文件失败,则返回一个负数。

可读 r: 4

可写 w: 2

执行 x: 1

默认值:0???;

如:

-rwx:可读可写可执行 (8421法转换数值)(0700)

-rw- :可读可写(8421法转换数值)(0600)(一般情况下默认)

open函数执行代码:(打开\创建)

运行结果:

(有该文件则显示成功,如果没有则先显示打开失败,然后创建该文件,fd返回3则代表打开成功)

write()函数:

ssize_t write(int fd, const void *buf, size_t count);

其中 fd 是文件描述符:

使用open()时返回的文件描述符

buf 是要写入的数据缓冲区:

内存,一般传内存地址,如数组名,指针名

count 是要写入的字节数:

写入字节数

write函数执行代码:(写入)

运行结果:

read()函数:

ssize_t read(int fd, void *buf, size_t count);

其中 fd 是文件描述符:

使用open()时返回的文件描述符

buf 是读取的数据缓冲区:

内存,一般传内存地址,如数组名,指针名

count 是要读取的字节数:

读取字节数

两个函数均返回实际读写字节数,读写失败返回-1

read函数执行代码:(写入)

运行结果:

(从file2文件中读取到15个字节,并打印出来)

其中整体代码有优化的地方,以及细节如下:

将原本的open操作来改变光标位置,替换成lseek()函数,其原型为:

off_t lseek(int fd, off_t offset, int whence);

fd:文件描述符

offset:偏移量

whence:位置

SEEK_SET:为0时表示文件开始位置。

SEEK_CUR:为0时表示当前位置。

SEEK_END:为0时表示结尾位置

函数返回值:成功返回当前位置到开始的长度、失败返回-1并设置errno

修改如下:

完整代码示例:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
    int fd;
    char *buf = "Ivan hen shuai!";//要写入的字符串
    fd = open("./file2",O_RDWR);
    if(fd == -1){
        printf("open file2 fail\n");
        fd = open("./file2",O_RDWR|O_CREAT,0600);
        if(fd > 0){
            printf("create file2 susceess!");
        }
    }
    printf("open susceess! fd = %d\n",fd);
    /*以上为打开操作*/
    int n_write = write(fd,buf,strlen(buf));
    if(n_write != -1){
        printf("write = %d byte to file2\n",n_write);//将写入内容打印
    }
    /*以上为写入操作*/
    char *read_buf;
    read_buf = (char*)malloc(sizeof (char)* n_write + 1);
    lseek(fd,0,SEEK_SET);
    int n_read = read(fd,read_buf,n_write);
    /*以上为读取操作*/
    printf("read = %d,context = %s\n",n_read,read_buf);//将读取内容打印
    close(fd);//关闭文件,将动态内存上传至静态文件
    
    return 0;
}

作者:Ivan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值