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!