c实现getline函数

getline函数可以获取文件中的一行数据。

原函数形式为 
ssize_t getline(char **linepter,size_t *n,FILE *stream)

返回类型ssize_t为有符号整形,其值为获取的字符数,文件结束则返回-1,包括换行符’\n’,但不包括字符串结束符’\0’。
linepter用来存储获得的字符串,size_t为无符号整形表示linepter的字节数。当*linepter为空时函数则动态为其分配
空间,注意要将size_t值赋0。当linepter的空间不足时,函数会通过realloc,重新分配更大的空间。stream为文件指
针,用于读取文件。

在了解了系统的getline函数后,根据其功能自己进行了实现。

ssize_t mygetline(char** line,size_t *n,FILE *fp)
{
    char *buf = *line;
    ssize_t c,i=0;//i来记录字符串长度,c来存储字符
    if(buf==NULL||*n==0)
    {
        *line = malloc(10);
        buf = *line;
        *n = 10;
    }
    //buf为或n为0时动态为期分配空间
    while((c=fgetc(fp))!='\n')
    {
        if(c==EOF)
            return -1;
        if(i<*n-2)//留2个空间给\n和\0
        {
            *(buf+i++)=c;
        }
        else
        {
            *n = *n+10;
            buf = realloc(buf,*n);//空间不足时,重新进行分配
            *(buf+i++)=c;
        }
    }
    *(buf+i++)='\n';
    *(buf+i)='\0';
    return i;

}

字符’\n’为一行的结束,EOF是文件结束标志。

测试代码:

int main()
{
    FILE *fp = fopen("F1","r");
    if(fp==NULL)
    {
        exit(EXIT_FAILURE);
    }
    char *buf = NULL;
    size_t i=0;
    ssize_t l;

    while((l=mygetline(&buf,&i,fp))!=-1)
    {
        printf("str:%s len:%d i:%u\n",buf,l,i);
        //打印字符串buf,返回字符串长度l和buf分配的字节数i
        free(buf);
        buf = NULL;
        i = 0;
    }
    free(buf);
    fclose(fp);
    exit(EXIT_SUCCESS);
    return 0;
}
  
 
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值