getline

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值