博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux系统中readline的实现
阅读量:6762 次
发布时间:2019-06-26

本文共 1634 字,大约阅读时间需要 5 分钟。

hot3.png

  

一次笔试的时候,有一题,要求使用非脚本语言读取一个文本文件的行数,刚好这几天再看Richard Stevens的《Unix网络编程》,刚好里面有关于readline函数的实现,看代码:

/* * readline.c * *  Created on: Feb 23, 2013 *      Author: root */#include #include #include #include ssize_tread_line(int fd, void *vptr, ssize_t maxlen){	ssize_t n, rc;	char c, *ptr;	ptr = vptr;	for (n = 1; n < maxlen; n++)	{		again:		if ((rc = read(fd, &c, 1)) == 1)		{			*ptr++ = c;			if (c == '\n')				break;		}		else if (rc == 0)		{			*ptr = 0;			return(n - 1);		} 		else		{			if (errno == EINTR)				goto again			return(-1);		}	}	*ptr = 0;	return(n);}
  

这个代码还是比较容易理解的,但是,作者在原文中也说过,这个是极其缓慢的读取方式,因为read函数每次只能读取一个字符,而read函数读取的字节数实际上是由第三个参数来决定的,下面就是改进了的readline函数

/* * readline.c * *  Created on: Feb 23, 2013 *      Author: root */#include #include #include #include #define MAXLINE 40static int read_cnt;static char *read_ptr;static char read_buf[MAXLINE];static ssize_tmy_read(int fd, char *ptr){	printf("a%d\n", read_cnt);	if (read_cnt <= 0)	{		again:			if ((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0)			{				if (errno == EINTR)					goto again;				return(-1);			} else if (read_cnt == 0)				return(0);			read_ptr = read_buf;			printf("%d\n", read_cnt);	}	read_cnt--;	*ptr = *read_ptr++;	return(1);}ssize_tread_line(int fd, void *vptr, ssize_t maxlen){	ssize_t n, rc;	char c, *ptr;	ptr = vptr;	for (n = 1; n < maxlen; n++)	{		if ((rc = my_read(fd, &c)) == 1)		{			*ptr++ = c;			if (c == '\n')				break;		}		else if (rc == 0)		{			*ptr = 0;			return(n - 1);		} else			return(-1);	}	*ptr = 0;	return(n);}
  

  一次readMAXLINE个字符,将返回的read_cnt个字节保存在readbuf里面,然后,然后利用read_cnt来控制循环,找到里面的'\n'

转载于:https://my.oschina.net/fsxchen/blog/110025

你可能感兴趣的文章
[转]PHP花括号变量
查看>>
【Opencv学习】摄像头采集、录像、截图小工具
查看>>
Fedora16安装中文语言包和中文输入法
查看>>
Windows 8实用窍门系列:14.windows 8中粘贴板(剪切板)的使用
查看>>
长连接API小心“窜包”问题
查看>>
开发者基础知识游戏,共10关,欢迎挑战
查看>>
ASP.NET中 RadioButtonList(单选按钮组)的使用
查看>>
SESSION 丢失
查看>>
DES可逆加解密
查看>>
图解Undo原理
查看>>
Kinect for Windows SDK V1.7 发布
查看>>
JAVA中的参数按值传递与按引用传递
查看>>
与Recommender System相关的会议及期刊
查看>>
如何理解ip路由和操作linux的路由表
查看>>
WCF的几种寄宿方式 ( 转)
查看>>
数字数据fzu 2120 数字排列
查看>>
ORACLE 数据库 SQL 转换 只取 年和月
查看>>
区间查询[2009国家集训队]小Z的袜子(hose)
查看>>
Android之使用微信开放api (三)---注册与反注册应用到微信
查看>>
我是怎样看待微博的
查看>>