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个字节?
773

被折叠的 条评论
为什么被折叠?



