《unix网络编程》中readline函数改进版

自己加了注释方便理解,希望帮到更多难以理解这段代码的人…

/* my_read和readline的关系是,
 * readline调用my_read,my_read先读入需要的全部数据进入自己的缓冲区,
 * 每次my_read返回一个字符,循环至readline通过调用间接把read_buf缓存区内的数据读取完毕。
 * 已读取的字节数由read_cnt存储,在第一次被调用之后的每次调用都通过该变量自减来判断缓存是否已被readline读取完。
 * 在被读取完之前,每次被调用时read_cnt是>0的,所以经过第一个if判断之后,
 * 都只有这句话*ptr = *read_ptr++;起作用,作用是把缓冲区里的下一个字符返回给readline,让readline来判断是否读到了'\n'
 * 当--read_cnt;执行至read_cnt为0时,my_read内的第一个if条件成立,执行if内的代码,返回给readline一个0,此时调用者知道缓存区内的数据已经被读取完了
 */
#include <stdint.h>
#include <errno.h>
#include <string.h>
#include "stdio.h"
#include "unistd.h"

#define MAXLINE 40

static ssize_t my_read(int fd, char *ptr);

ssize_t readline(int fd, void *vptr, size_t maxlen);

static ssize_t read_cnt = -127;//设置一个为负数的初始值
static char *read_ptr;
static char read_buf[MAXLINE];

int main(void) {

    return 0;
}

static ssize_t
my_read(int fd, char *ptr) {
    if (read_cnt < 0) {
        again:
        if ((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {//读取失败的情况
            if (errno == EINTR) {
                goto again;
            } else {
                return (-1);
            }
        } else if (read_cnt == 0) {
            return (0);
        } else {//读取成功且返回值不等于0
            read_ptr = read_buf;
        }
    }
    --read_cnt;
    *ptr = *read_ptr++;
    return (1);
}

ssize_t readline(int fd, void *vptr, size_t maxlen) {
    char c, *ptr = vptr;
    ssize_t n, rc;
    for (n = 1; n < maxlen; ++n) {
        if ((rc = my_read(fd, &c)) == 1) {
            *ptr++ = c;
            if (c == '\n') {
                break;
            }
        } else if (rc == 0) {

            *ptr = NULL;
            return (n - 1);

        } else {
            return (-1);
        }
    }
    *ptr = NULL;
    return (n);
}








































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值