tac命令的实现 分类: linux 2014-06-02 00:08 344人阅读 评论(0) 收藏
此程序实现简化的linux中的tac命令。即对文件按行倒序输出。
首先将文件指针置于文件尾,从后向前移动指针,
将两个换行符'\n'间的内容作为一行输出。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFSIZE 4096
char buf[BUFSIZE];
void reverse(int fp);
void main(int argc,char*argv[])
{
int fp;
int i=1;
if(argc==1)
{
fp=STDIN_FILENO;
reverse(fp);
}
for(;i<argc;i++)
{
if((fp=open(argv[i],O_RDONLY))==-1)
{
fprintf(stderr,"open %s error\n",argv[i]);
continue;
}
reverse(fp);
close(fp);
}
exit(0);
} void reverse(int fp)
{
off_t offset;
int count=0;
char tmp[2]={0};
if((offset=lseek(fp,-1,SEEK_END))==-1)//将文件指针指向最后一个字符。
{
printf("seek error\n");
return;
}
while(1) //从后向前扫描文件,每遇到两个\n符,将之间的字符串作为一行输出。
{ //只包含后一个\n符(左开右闭),直至到文件开头。
pread(fp,tmp,1,offset);
count++; //count用来统计两个\n符间字符个数。
while(strcmp(tmp,"\n")!=0&&offset!=0)
{
offset=lseek(fp,-1,SEEK_CUR);
pread(fp,tmp,1,offset);
count++;
}
if(offset==0) //若文件指针在文件开头,从此处读取长度count的字符串并输出。
{
pread(fp,buf,count,offset);
buf[count]='\0';
printf("%s",buf);
break;
}
else
{
offset=lseek(fp,1,SEEK_CUR); //若文件指针指向\n符,指针向后移动一位,跳过该\n;
pread(fp,buf,--count,offset);//并读取长度count-1的字符串并输出。
buf[count]='\0';
printf("%s",buf);
offset=lseek(fp,-2,SEEK_CUR);//文件指针向前移动2位;
count=1; //重新计数,此时已经读取了一个\n。
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
tac命令的实现 分类: linux 2014-06-02 00:08 344人阅读 评论(0) 收藏的更多相关文章
- 随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比. 程序用一次遍历,实现带权随机选取. 算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+... ...
- VS2010中使用命令行参数 分类: c/c++ 2014-07-11 22:24 634人阅读 评论(0) 收藏
在Linux下编程习惯了使用命令行参数,故使用VS2010时也尝试了一下. 新建项目,c++编写程序如下: #include<iostream> #include<fstream&g ...
- egrep命令的实现 分类: 编译原理 2014-06-01 23:41 329人阅读 评论(0) 收藏
本程序实现了egrep命令,首先将正则表达式转换为NFA,并实现模拟NFA的算法. 本程序使用flex实现词法分析,bison实现语法分析 若给定的一行字符串中存在一个字串能被该NFA接受,则输出整行 ...
- 递归查找无效的符号链接 分类: linux c/c++ 2014-06-02 00:14 345人阅读 评论(0) 收藏
本程序实现在指定目录下递归查找无效的符号链接. 1.设计思路 逐个读取给定目录中的目录项,判断类型 (1)若为目录,则读取该目录中的目录项并判断类型: (2)若为链接文件,则读取出其指向文件的名称(绝 ...
- 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏
在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺位置. 先看看效果图吧: 实现思路: 第一步:整理行政区域表: 要实现通过 ...
- C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏
const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...
- 浅谈new operator、operator new和placement new 分类: C/C++ 2015-05-05 00:19 41人阅读 评论(0) 收藏
浅谈new operator.operator new和placement new C++中使用new来产生一个存在于heap(堆)上对象时,实际上是调用了operator new函数和placeme ...
- short-path problem (Spfa) 分类: ACM TYPE 2014-09-02 00:30 103人阅读 评论(0) 收藏
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #i ...
- Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏
#include<iostream> #include<cstdio> #include<algorithm> #define Max 1005 using nam ...
随机推荐
- Antivius for Linux
http://www.clamav.net/ https://www.avast.com/zh-cn/linux-server-antivirus http://www.f-prot.com/ ...
- BC一周年B
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- Angular结构简单介绍
在当前项目目录下,使用Angular-CLI生成一个组件:heroes ng generate component heroes 主界面(也就是一个主模块+多个单模块,例如我们创建的heroes(单模 ...
- [iOS] dom解析xml数据,拿到<>里面的值
<response result="success" timestamp="1338890206" cityver="1.0"> ...
- hdu1873 看病要排队(结构体优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- Matplotlib绘图基础
import matplotlib.pyplot as plt import numpy as np #绘图流程 x=np.linspace(-1,1,100) y=x**2 plt.plot(x,y ...
- 【iOS系列】-UIWebView加载网页禁止左右滑动
[iOS系列]-UIWebView加载网页禁止左右滑动 问题: 做项目时候,用UIWebView加载网页的时候,要求是和微信网页中打开的网页的效果一样,也即是只能上下滑动,不能左右滑动,也不能缩放. ...
- [读书笔记]流畅的Python(Fluent Python)
<流畅的Python>这本书是图灵科技翻译出版的一本书,作者Luciano Ramalho. 作者从Python的特性角度出发,以Python的数据模型和特殊方法为主线,主要介绍了pyth ...
- envoy
微服务意味着网络更加依赖于服务抽象边界. 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态.
- Building Microservices: Using an API Gateway
What are microservices? http://microservices.io/ What are microservices? Microservices - also known ...