C语言read函数(pwn前置)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值