【Linux之IO系统编程学习】02.write函数和read函数

  • Post author:
  • Post category:linux




【Linux之IO系统编程学习】


项目代码获取:


https://gitee.com/chenshao777/linux_-io.git



(麻烦点个免费的Star哦,您的Star就是我的写作动力!)



02.write函数和read函数


目录



一、write函数(man手册)



二、read函数(man手册)



三、写入+读取实验



四、lseek函数



五、写入+读取实验(加入读写指针移动)

一、write函数(man手册)

man 2 write

得到 man 手册内容

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
其他内容省略......

可以看到需要包含 unistd.h 头文件,且write函数有

三个参数

,以及一个返回值

项目 含义
fd 操作的文件描述符
buf 写入的数组
count 写入的字节数
返回值 写入成功的字节数

二、read函数(man手册)

man 2 read

得到 man 手册内容

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
其他内容省略......

可以看到需要包含 unistd.h 头文件,且read函数有

三个参数

,以及一个返回值

参数 含义
fd 操作的文件描述符
buf 读取的数据存放到该数组
count 要读取的字节数
返回值 实际读取到的字节数

三、写入+读取实验

使用

write函数

向文件a.txt中写入数据,使用

read函数

读取出数据并打印显示

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int fd;
    int wr_res, re_res;
    char wr_buf[100];
    char re_buf[100];
    /*通过main参数接收要写入的内容*/
    sprintf(wr_buf, "%s", argv[2]);

    /*以清空全部内容和读写方式打开文件*/
    fd = open(argv[1], O_TRUNC | O_RDWR);
    if(fd < 0){
        printf("open file failed , fd = %d\n",fd);
        return 0;
    }else{
        printf("open file success , fd = %d\n",fd);
    }

    /*向文件中写入数据*/
    wr_res = write(fd, wr_buf, strlen(wr_buf));
    /*write函数的返回值是写入成功的字节数*/
    printf("write success bytes = %d\n",wr_res)

    /*读取文件内容*/
    re_res = read(fd, re_buf, sizeof(re_buf));
    /*read函数的返回值是读取成功的字节数*/
    printf("read success byte = %d\n",re_res);
    printf("read data = %s\n", re_buf);
    
    close(fd);
    return 0;
}

步骤:

1.通过main参数接收要写入的内容

2.以清空全部内容和读写方式打开文件

3.使用write函数向文件中写入数据

4.使用read函数读取文件内容,并打印读取成功的字节数与读取的内容

实验结果:

hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./a.out a.txt nihao
open file success , fd = 3
write success bytes = 5
read success byte = 0
read data = 

发现读取成功的字节数是0,这就要引入一个概念,就是

文件读写指针

,由于我们是先写入内容,所以文件读写指针在

文件的最后位置

,所以read的时候默认从最后开始读取,所以读

不到数据


四、lseek函数

使用

lseek函数

可以操作文件读写指针的位置

使用man手册查看

man 2 lseek
省略其他内容......
SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

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

DESCRIPTION
       lseek() repositions the file offset of the open file description associated with the file descriptor
       fd to the argument offset according to the directive whence as follows:

       SEEK_SET
              The file offset is set to offset bytes.

       SEEK_CUR
              The file offset is set to its current location plus offset bytes.

       SEEK_END
              The file offset is set to the size of the file plus offset bytes.
省略其他内容......
off_t lseek(int fd, off_t offset, int whence);
参数 含义
fd 操作的文件描述符
offset 偏移量(相对于whence参数)
whence 当前位置基点
返回值 文件读写指针当前位置(失败返回-1)


whence参数有三个选项


SEEK_SET : 文件开头位置

SEEK_CUR: 当前读写指针位置

SEEK_END: 文件结尾位置


所以在读取文件之前,先将读写指针调到文件开头位置即可读取成功


即加入下面这一句

lseek(fd, 0, SEEK_SET);

五、写入+读取实验(加入读写指针移动)

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int fd;
    int wr_res, re_res;
    char wr_buf[100];
    char re_buf[100];
    /*通过main参数接收要写入的内容*/
    sprintf(wr_buf, "%s", argv[2]);

    /*以清空全部内容和读写方式打开文件*/
    fd = open(argv[1], O_TRUNC | O_RDWR);
    if(fd < 0){
        printf("open file failed , fd = %d\n",fd);
        return 0;
    }else{
        printf("open file success , fd = %d\n",fd);
    }

    /*向文件中写入数据*/
    wr_res = write(fd, wr_buf, strlen(wr_buf));
    /*write函数的返回值是写入成功的字节数*/
    printf("write success bytes = %d\n",wr_res);

    /*调整文件定位指针位置, 相对文件开头位置偏移0个位置*/
    lseek(fd, 0, SEEK_SET);

    /*读取文件内容*/
    re_res = read(fd, re_buf, sizeof(re_buf));
    /*read函数的返回值是读取成功的字节数*/
    printf("read success byte = %d\n",re_res);
    printf("read data = %s\n", re_buf);

    close(fd);

    return 0;
}

运行结果:

hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./a.out a.txt nihao
open file success , fd = 3
write success bytes = 5
read success byte = 5
read data = nihao

读写成功!



版权声明:本文为HuangChen666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。