Linux系统—read、write函数

ssize_t read(int fd, void *buf, size_t count);
//将文件中的数据读入内存

ssize_t write(int fd, const void *buf, size_t count);
//把内存中的数据写入到文件里

实现文件拷贝:
在这里插入图片描述

1.1 read函数

输入以下命令查看函数帮助文档:

man 2 read/write
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
  • 参数
    • fd: 文件描述符,open得到的,通过这个文件描述符操作某个文件
    • buf:需要读取数据存放的地方,数组的地址传出参数
      • 传出参数:传入一个空的数组进去,函数将内容保存到数组后,可以通过数组取数据
    • count:指定的数组的大小
  • 返回值
    • 成功
      • >0:返回实际的读取到的字节数
      • =0:文件已经读取完了
    • 失败:返回-1,并且设置errno

1.2 write函数

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
  • 参数
    • fd:文件描述符,open得到,通过文件描述符操作某个文件
    • buf:要往磁盘写入的数据
    • count:要写的数据的实际的大小
  • 返回值
    • 成功:返回实际写入的字节数
    • 失败:返回-1,并设置合适的errno

1.3 实现文件拷贝

编写copyfile.c:

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

int main() {

    // 1. 通过open打开english.txt文件,只读
    int srcfd = open("english.txt", O_RDONLY);

    if(srcfd == -1) {
        perror("open");
        return -1;
    }
    // 2. 创建一个新的文件(拷贝文件),只写
    int destfd = open("cpy.txt", O_WRONLY | O_CREAT, 0664);
    
    if(destfd == -1) {
        perror("open");
        return -1;
    }
    // 3. 频繁的读写操作
    // 创建缓冲区
    char buf[1024] = {0};

    int len = 0;
    while(( len = read(srcfd, buf, sizeof(buf)) ) > 0 ) {
        // 每读一次数据,就写入到拷贝文件中
        write(destfd, buf, len);
    }

    // 4. 关闭文件
    close(srcfd);
    close(destfd);
    
    return 0;
}

在终端中GCC编译并运行,得到拷贝文件cpy.txt

fuerer@fuerer-virtual-machine:~/Linux/lesson10$ ls
copyfile.c  english.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson10$ gcc copyfile.c -o copy
fuerer@fuerer-virtual-machine:~/Linux/lesson10$ ls
copy  copyfile.c  english.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson10$ ./copy
fuerer@fuerer-virtual-machine:~/Linux/lesson10$ ll
总用量 280
drwxrwxr-x  2 fuerer fuerer   4096 324 10:31 ./
drwxrwxr-x 11 fuerer fuerer   4096 324 10:02 ../
-rwxrwxr-x  1 fuerer fuerer   8528 324 10:31 copy*
-rw-rw-r--  1 fuerer fuerer   1792 324 10:31 copyfile.c
-rw-rw-r--  1 fuerer fuerer 129772 324 10:31 cpy.txt
-rw-rw-r--  1 fuerer fuerer 129772 324 10:21 english.txt

cpy.txt与english.txt大小均为 129772 个字节

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐