getline
getline源码,根据源码编写自己的getline函数,只保留核心功能,。
#define GETDELIM_GROWBY 64
/**
* @brief 读取一行数据
*
* @param lineptr 数据存放缓冲区
* @param n lineptr的大小
* @param stream
* @return ssize_t 成功返回读取到的数量,失败返回-1
*/
ssize_t mygetline( char **lineptr, size_t *n, FILE *stream )
{
register char *buf; /*设置寄存器变量,加快访问速度*/
ssize_t pos;
int c;
if( !lineptr || !n || !stream ) /*传入的参数为null*/
{
fprintf( stderr,"%d : arg is null", __LINE__ );
return -1;
}
else
{
/*如果lineptr传递为null,那么设置大小为0*/
if( !( buf = *lineptr ) )
{
*n = 0;
}
pos = 1;
do {
if( pos >= *n )
{
if( !( buf = realloc( buf, *n + GETDELIM_GROWBY ) ) ) /*动态分配缓冲区buuf*/
{
pos = -1;
break;
}
*n += GETDELIM_GROWBY;
*lineptr = buf;
}
/*从stream中获取一个字符*/
if( ( c = fgetc( stream ) ) != EOF )
{
buf[++pos - 2] = c; /*将字符放入buf*/
if( c != '\n' ) /*没检测到\n*/
{
continue;
}
}
/*已检测到\n*/
if( ( pos -= 2 ) >= 0 )
{
buf[++pos] = 0; /*将字符串末尾的\n替换为\0*/
}
break;
}while(1);
}
return pos;
}
该函数在访问 stream 时没有使用互斥锁,在多线程环境下应加上。
如果在调用之前 *lineptr 设置为 NULL 并且 、*n 设置为 0,那么 getline() 将分配一个缓冲区来存储该行。 即使 getline() 失败,用户程序也应释放此缓冲区。或者,在调用 getline() 之前,*lineptr 可以包含一个指向 malloc 分配的缓冲区 *n 的指针字节大小。 如果缓冲区不够大,无法容纳该行,getline() 使用 realloc 调整其大小,根据需要更新 *lineptr 和 *n。