天天看點

《unix網絡程式設計》中readline函數改進版

自己加了注釋友善了解,希望幫到更多難以了解這段代碼的人…

/* my_read和readline的關系是,
 * readline調用my_read,my_read先讀入需要的全部資料進入自己的緩沖區,
 * 每次my_read傳回一個字元,循環至readline通過調用間接把read_buf緩存區内的資料讀取完畢。
 * 已讀取的位元組數由read_cnt存儲,在第一次被調用之後的每次調用都通過該變量自減來判斷緩存是否已被readline讀取完。
 * 在被讀取完之前,每次被調用時read_cnt是>的,是以經過第一個if判斷之後,
 * 都隻有這句話*ptr = *read_ptr++;起作用,作用是把緩沖區裡的下一個字元傳回給readline,讓readline來判斷是否讀到了'\n'
 * 當--read_cnt;執行至read_cnt為時,my_read内的第一個if條件成立,執行if内的代碼,傳回給readline一個,此時調用者知道緩存區内的資料已經被讀取完了
 */
#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 = -;//設定一個為負數的初始值
static char *read_ptr;
static char read_buf[MAXLINE];

int main(void) {

    return ;
}

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

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

            *ptr = NULL;
            return (n - );

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








































           

繼續閱讀