head/tail实现
typedef struct
{
int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFFSIZE];
}rio_t; void rio_readinitb(rio_t *rp, int fd)
{
rp->rio_fd = fd;
rp->rio_cnt = ;
rp->rio_bufptr = rp->rio_buf;
} ssize_t rio_read(rio_t *rp, void *usrbuf, size_t n)
{
int cnt = ; while (rp->rio_cnt <= )
{
if ((rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, sizeof(rp->rio_buf))) < )
{
if (errno != EINTR)
{
return -;
}
}
else if (rp->rio_cnt == )
{
return ;
}
else
{
rp->rio_bufptr = rp->rio_buf;
}
} //cnt = n > rp->rio_cnt?rp->rio_cnt:n; cnt = n;
if (n > rp->rio_cnt)
{
cnt = rp->rio_cnt;
} memcpy(usrbuf, rp->rio_bufptr, cnt);
rp->rio_cnt -= cnt;
rp->rio_bufptr += cnt; return cnt;
} ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen, int count)
{
int i = , rc = , num = ;
char c = , *buf = usrbuf; lseek(rp->rio_fd, maxlen, SEEK_END); for (i = ; i < maxlen; i++)
{
if ((rc = rio_read(rp, &c, )) == )
{
*buf++ = c;
if (c == '\n')
{
if (++num == count)
{
break;
}
}
}
else if (rc == )
{
if (i == )
{
return ;
}
else
{
break;
}
}
else
{
return -;
}
} *buf = '\0';
return i;
}
二、head命令实现
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "rio.h" #define MAXSIZE 4096 int main(int argc, char **argv)
{
if (argc < )
{
fprintf(stderr, "usage %s [-n n] filename\n", argv[]);
return -;
} int times = , i = , in_fd = -, n_char = ;
char filename[] = {};
char buf[MAXSIZE] = {};
rio_t rio_buf = {}; for (i = ; i < argc; i++)
{
if (!strcmp(argv[i], "-n"))
{
times = atoi(argv[++i]);
}
else
{
snprintf(filename, sizeof(filename), "%s", argv[i]);
}
} if ((in_fd = open(filename, O_RDONLY)) == -)
{
fprintf(stderr, "open %s failed\n", filename);
return -;
} rio_readinitb(&rio_buf, in_fd);
if ((n_char = rio_readlineb(&rio_buf, buf, MAXSIZE, times)) > )
{
write(STDOUT_FILENO, buf, n_char);
} close(in_fd); return ;
}
三、tail命令实现
#include "rio.h" #define MAXSIZE 4096 void show_info(char *buf, char **ptr, int count); int main(int argc, char **argv)
{
if (argc < )
{
fprintf(stderr, "usage %s [-n n] filename\n", argv[]);
return -;
} int times = , i = , in_fd = -;
char filename[] = {};
char buf[MAXSIZE] = {};
rio_t rio_buf = {};
char *ptr[MAXSIZE]; for (i = ; i < argc; i++)
{
if (!strcmp(argv[i], "-n"))
{
times = atoi(argv[++i]);
}
else
{
snprintf(filename, sizeof(filename), "%s", argv[i]);
}
} if ((in_fd = open(filename, O_RDONLY)) == -)
{
fprintf(stderr, "open %s failed\n", filename);
return -;
} rio_readinitb(&rio_buf, in_fd);
rio_read(&rio_buf, buf, MAXSIZE); show_info(buf, ptr, times); return ;
} void show_info(char *buf, char **ptr, int times)
{
int num = ;
int flag = ; if (num < times)
{
*ptr = strrchr(buf, '\n');
flag = ;
**ptr = '\0';
show_info(buf, ptr + , --times);
} if (flag)
{
printf("%s\n", *ptr + );
}
}
通过递归show_info来实现按顺序打印,其实也可以用链表来实现,不过递归写起来简单。
head/tail实现的更多相关文章
- REDHAT一总复习1 输出重定向及head tail的用法
1.使用bash命令,在server机上完成以下任务.(考点是:head tail的使用) .显示/usr/bin/clean-binary-files文件的前12行,并将其输出到/home/stu ...
- tail命令详解
搜索 纠正错误 添加实例 tail 在屏幕上显示指定文件的末尾若干行 补充说明 tail命令 用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在 ...
- Linux命令详解之—tail命令
tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...
- linux命令之tail
tail用于输出文件末尾部分.一个比较有用的功能是tail + grep实现类似于安卓开发时调试使用的logcat,具体操作是: 一般我是用SecureCRT连接linux,然后使用SecureCRT ...
- PHP实现linux命令tail -f
PHP实现linux命令tail -f 今天突然想到之前有人问过我的一个问题,如何通过PHP实现linux中的命令tail -f,这里就来分析实现下. 这个想一想也挺简单,通过一个循环检测文件,看文件 ...
- tail -f 和 -F 的用法
tail -f 和 -F 的用法 Tai 2010-08-16 16:03:18 -f 是--follow[=HOW]的缩写, 可以一直读文件末尾的字符并打印出来."[=HOW]" ...
- scala tail recursive优化,复用函数栈
在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function c ...
- linux head、tail、sed、cut、grep、find
head用法: head 参数 文件名 -cn:显示前n个字节 -n:显示前n行 例子:head -c20 1.txt 显示1.txt文件中前20个字符 ls | head -20:显示前20 ...
- linux命令每日一练习-tail
tail 是查看文件的末尾 tail -n 5*** 显示文件×××的最后5行 tail -n +5 ××× 显示文件×××从第5行开始的内容 tail -f *** 监视文件×××的末尾.循环展示
随机推荐
- 遍历dynamic的方式
一.遍历ExpandoObject /// <summary> /// 遍历ExpandoObject /// </summary> [TestMethod] public v ...
- VMware下Windows Server 2012添加新磁盘
系统管理员在VM下新装了一台Windows Server 2012服务器,我在上面安装了SQL Server 2014 Standard版数据库,安装之初,只分配了一个C盘,我想在这台服务器上添加了三 ...
- Javascript刷题 》数组求和
计算给定数组 arr 中所有元素的总和 输入描述: 数组中的元素均为 Number 类型 输入例子: sum([ 1, 2, 3, 4 ]) 输出例子: 10 解题方法 1.定义一个变量,将前面的和后 ...
- 开发node桌面级应用工具:apk转化epub
随着苹果ibooks对国内的开放,最近接了个麻烦的需求: 把现有的APK转化支持苹果ibooks电子书的epub格式 apk,基本都知道就是安卓的应用程序 epub,是ibooks支持的电子书格式 ( ...
- 前端学HTTP之网关、隧道和中继
前面的话 Web是一种强大的内容发布工具.人们已经从只在网上发送静态的在线文档,发展到共享更复杂的资源,比如数据库内容或动态生成的HTML页面.Web浏览器为用户提供了一种统一的方式来访问因特网上的内 ...
- 从零开始编写自己的C#框架(16)——Web层后端父类
本章节讲述的各个类是后端系统的核心之一,涉及到系统安全验证.操作日志记录.页面与按键权限控制.后端页面功能封装等内容,希望学习本系列的朋友认真查看新增的类与函数,这对以后使用本框架进行开发时非常重要. ...
- C# 给PDF添加图片背景
C# 给PDF添加图片背景 今天要实现的是给PDF文件添加图片背景这个功能.PDF是近年来最流行的文件之一,无论是办公还是日常生活中都经常会用到,很多时候,PDF文件的背景色都是白色,看多了难免觉得累 ...
- C#字符串的倒序输出
介绍 在本文中,我将演示如何将字符串的单词倒序输出.在这里我不是要将“John” 这样的字符串倒序为成“nhoJ”,.这是不一样的,因为它完全倒序了整个字符串.而以下代码将教你如何将“你 好 我是 缇 ...
- (转)ubuntu apache2 的负载均衡和反向代理
apache功能其实很是强大,最近一段时间研究了下apache的反向代理和负载均衡,反向代理网协的外网出口和我的博客出口就是通过apache的反向代理实现的,总结一下,重点说说负载均衡的配置. 首先说 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...