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;
}
  
 
 

getline()函数是一个常用的C语言函数,用于从输入流中读取一行字符并存储到字符数组中。下面是getline()函数实现代码: ``` int getline(char s[], int lim) { int c, i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) s[i = c; if (c == '\n') { s[i = c; i++; } s[i = '\0'; return i; } ``` 该函数接受两个参数,一个是字符数组s,用于存储读取到的字符;另一个是整数lim,表示字符数组s的最大长度。函数会逐个读取输入的字符,直到达到lim的上限、遇到文件结束符EOF或遇到换行符'\n'为止。在读取过程中,将字符存储到字符数组s中,并在数组末尾添加'\0'作为字符串的结束符。函数返回值为实际读取到的字符数(不包括结束符)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【C】getline()函数实现](https://blog.csdn.net/ww1473345713/article/details/51474553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [getdelim:C语言中的getdelim()和getline()实现](https://download.csdn.net/download/weixin_42101384/16632127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python linecache.getline()读取文件中特定一行的脚本](https://download.csdn.net/download/weixin_38516491/13769977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值