博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
山寨c 标准库中的getline 函数
阅读量:6500 次
发布时间:2019-06-24

本文共 1706 字,大约阅读时间需要 5 分钟。

hot3.png

要山寨一个函数,只要看两点

  1. 原版函数的形参。

  2. 原函数的返回值。

下面是函数原型。

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

函数返回值。

RETURN VALUE

       On  success,  getline() and getdelim() return the number of characters read, including the delimiter character, but not including the terminating null byte.  This value can be used to handle embedded null bytes in the line read.

      Both functions return -1 on failure to read a line (including end-of-file condition).

下面是山寨getline 实现代码。

#include 
#include 
#include 
ssize_t ho_getline(char **buf, size_t *n, FILE *fp) {    char c;    int needed = 0;    int maxlen = *n;    char *buf_ptr = *buf;    if (buf_ptr == NULL || maxlen == 0) {        maxlen = 128;        if ((buf_ptr = malloc(maxlen)) == NULL)            return -1;    }    do {        c = fgetc(fp);        buf_ptr[needed++] = c;        if (needed >= maxlen) {            *buf = buf_ptr;            buf_ptr = realloc(buf_ptr, maxlen *= 2);            if (buf_ptr == NULL) {                (*buf)[needed - 1] = '\0';                return -1;            }        }        if (c == EOF)            return -1;    } while (c != '\n');    buf_ptr[needed] = '\0';    *buf = buf_ptr;    *n = maxlen;    return needed;}

测试代码:

void test_main(const char *fname) {    FILE *fp;    char *line = NULL;    size_t len = 0;    ssize_t read;    fp = fopen(fname, "r");    if (fp == NULL)        exit(EXIT_FAILURE);    while ((read = ho_getline(&line, &len, fp)) != -1) {        printf("Retrieved line of length %zu :\n", read);        printf("%s", line);    }       fclose(fp);    free(line);}int main(void) {    test_main("/etc/motd");    return 0;}

转载于:https://my.oschina.net/guonaihong/blog/278505

你可能感兴趣的文章
masonry 基本用法
查看>>
Word产品需求文档,已经过时了【转】
查看>>
dtoj#4299. 图(graph)
查看>>
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
Visual Studio Remote Debugger(for 2005/2008) .net远程调试<转>
查看>>
怎么获得combobox的valueField值
查看>>
Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
查看>>
浅谈网络协议(四) IP的由来--DHCP与PXE
查看>>
jre与jdk的区别
查看>>
全景图的种类
查看>>
git 维护
查看>>
jfinal框架下使用c3P0连接池连接sql server 2008
查看>>
Jfinal Generator 不需要生成带某个前缀的表名数组的方法
查看>>