read
read (int __fd, void *__buf, size_t __nbytes)
read 函数是C语言中用来读取文件数据的系统调用
bytesRead = read(fd, buffer, sizeof(buffer) - 1);
含义:从文件描述fd指定的文件中读取指定大小的数据,并将其放在buffer中
注:
-
read 的返回值是读取的字节数,若读取失败,返回 -1
-
fd,文件描述符,代表对应文件
-
char buffer[200]; //buffer 是一个字符组,可存200个字节
-
sizeof(buffer) - 1
:表示要读取的字节数。这里sizeof(buffer)
计算出缓冲区的总大小(例如,如果buffer
是一个字符数组,大小为 200),然后减去 1 是为了为字符串的结束符\0
留出空间。
示例:
提前创建好了 example.txt 文件
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> int main(){ int fd; ssize_t byteread; char buffer[100]; fd = open("example.txt",O_RDONLY); if(fd == -1){ perror("failed to open file"); exit(EXIT_FAILURE); } byteread = read(fd,buffer,sizeof(buffer)-1); if(byteread == -1){ perror("failed to read file"); close(fd); exit(EXIT_FAILURE); } buffer[byteread]='\0'; printf("read %zd bytes:\n%s\n",byteread,buffer); close(fd); return 0; }
分析:
1.引入库
stdio.h:提供输入和输出函数,如 printf 和 perror。 unistd.h:包含对 POSIX 操作系统 API 的访问,如 read 和 close。 fcntl.h:用于文件控制相关功能,如打开文件的标志。 stdlib.h:为使用 exit 和内存分配提供支持。
2.打开文件
fd = open("example.txt", O_RDONLY); //使用open函数以只读模式打开文件,若成功,返回文件描述符;失败则返回-1
3.读取文件
byteread = read(fd, buffer, sizeof(buffer) - 1); //使用read函数读取fd指向的文件,最多读取 199 字节(留出一个字节用来放字符串结束标志 \0)
4.添加结束标志
buffer[byteread] = '\0'; //数组添加操作
5.格式化输出结果
printf("read %zd bytes:\n%s\n", byteread, buffer); //%zd 代表 ssize_t 类型数据,即字节数;%s为字符串类型 //buffer内存储着读取的字符串
补充:
代码中穿插了错误判断和文件关闭(可以忽略)
ssize_t类型:
-
ssize_t
是有符号整型 -
用于存储读取的字节数,返回值可负,表示出错
运行上述代码得到结果
[Running] cd "d:\Cspace\fire\" && gcc read.c -o read && "d:\Cspace\fire\"read read 124 bytes: I really want to pwn. C,can you help me? Py,can you do me a favor? Bili,can you stand up for me? I know,it's only up to me.
一开使我设置的是 char buffer[100] ;
发现文件内容没有读完
[Running] cd "d:\Cspace\fire\" && gcc read.c -o read && "d:\Cspace\fire\"read read 96 bytes: I really want to pwn. C,can you help me? Py,can you do me a favor? Bili,can you stand up for me
这里为什么只读了96个字节?