Linux文件读取操作:read函数的使用

read函数作用:读取文件内容,读取打开/创建(open)文件中写入(write)的内容。

包含的头文件:

#include <unistd.h>

函数原型

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

read函数中的参数:

① int fd文件描述符,open一个文件,就会返回到文件描述符中,对文件后续的读写操作都需要用到文件描述符。
② void *buf无类型的指针,指向缓冲区buf中读写的文件内容
③ size_t count读/写入文件内容的字节大小

🔺参数归纳: 从缓冲区buf开始读取count字节到由文件描述符fd引用的文件里(读取内容前,会先将内容写入到缓冲区buf)。

函数返回值

读取失败:返回值为-1;

读取成功:返回读取内容的字节数。

示例代码

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf = "hello world!";
        fd = open("./file1",O_RDWR);
        if(fd == -1){
                printf("open file1 failed\n");
        }
        fd = open("./file1",O_CREAT|O_RDWR,0600);
        if(fd > 0){
                printf("open file1 success\nfd=%d\n",fd);
        }
//       ssize_t write(int fd, const void *buf, size_t count);
        int n_write = write(fd,buf,strlen(buf));
        if(n_write != -1){
                printf("write %d Byte to file1\n",n_write);
        }
        close(fd);//先关闭文件 在重新打开文件,使光标移到头,才能完整读取
        fd = open("./file1",O_RDWR);//逻辑没有问题,但这是一个笨办法
        char *readBuf;
        readBuf = (char *)malloc(sizeof(char)*n_write);
//      ssize_t read(int fd, void *buf, size_t count);
        int n_read = read(fd,readBuf,n_write);
        printf("read:%d Byte,%s\n",n_read,readBuf);
        close(fd);

        return 0;
}

代码编写完整流程

① 创建/打开一个名为“file1”的文件,并返回到文件描述符中,权限为“O_RDWR”可读可写;

fd = open("./file1",O_CREAT|O_RDWR,0600);

② 定义无类型指针的缓冲区buf为char型(🔺可以根据写入内容定义为其他类型),写入字符串“ hello world!”;

char *buf = "hello world!";

③ 计算写入文件的大小:strlen(buf)。注意需要包含头文件“#include<string.h>”;

//       ssize_t write(int fd, const void *buf, size_t count);
        int n_write = write(fd,buf,strlen(buf));

④ 写入成功后,使用close(fd)关闭文件,并且重新打开;🔺此步骤直接使用lseek函数移动光标,更见简洁高效(下一篇文章会讲)。

 close(fd);//先关闭文件 在重新打开文件,使光标移到头,才能完整读取
 fd = open("./file1",O_RDWR);//逻辑没有问题,但这是一个土办法

⑤ 使用malloc函数动态开辟缓冲区readBuf所需要的内存大小;🔺这里的readBuf主要作用于读取文件时使用的缓冲区,便于区分写入文件时所使用的缓冲区buf。

 char *readBuf;
 readBuf = (char *)malloc(sizeof(char)*n_write);

⑥ 对应read函数原型,写入参数;

//      ssize_t read(int fd, void *buf, size_t count);
        int n_read = read(fd,readBuf,n_write);
        printf("read:%d Byte,%s\n",n_read,readBuf);

编译结果:字符串“hello world!”这12个字节读取成功。

dhw@dhw-virtual-machine:~$ gcc demo4.c
dhw@dhw-virtual-machine:~$ ./a.out
open file1 failed
open file1 success
fd=3
write 12 Byte to file1
read:12 Byte,hello world!

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D.•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值