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 *** 监视文件×××的末尾.循环展示
随机推荐
- 阿里云服务器的坑=====部署EF+MVC
异常处理汇总 ~ 修正果带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4599258.html 先参考:http://www.cnblogs.com/dun ...
- 快速打造跨平台开发环境 vagrant + virtualbox + box
工欲善其事必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑 刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电 ...
- AFNetworking 3.0 源码解读(五)之 AFURLSessionManager
本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- MySQL的数据模型
MySQL的数据类型主要分为三大类: 数值型(Numeric Type) 日期与时间型(Date and Time Type) 字符串类型(String Type) 1. 数值 MySQL的数值类型按 ...
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- 回车去替换铵钮的click点击功能
某一时候,我们不想在form的所有必填的域均完成之后,再去使用mouse去点击铵钮来提交数据.而是直接按回车去focus提交的铵钮来提交. 可以写jQuery script程序:
- StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...
- jQuery+CSS3文字跑马灯特效
jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向. 效果展示 http://hovertree.com/te ...
- springmvc配置文件web.xml详解各方总结(转载)
Spring分为多个文件进行分别的配置,其中在servlet-name中如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xm ...
- Android 手机卫士8--删除通话记录
1.编写代码需要注意bug: 再删除通话记录的时候,删除的是以前的通话记录,本次拦截下来的电话号码,通话记录没有删除?????? 问题原因:数据库中本次通话记录的电话号码还没有插入,就做了删除操作 2 ...