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