此程序实现简化的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) 收藏的更多相关文章

  1. 随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏

    本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比. 程序用一次遍历,实现带权随机选取. 算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+... ...

  2. VS2010中使用命令行参数 分类: c/c++ 2014-07-11 22:24 634人阅读 评论(0) 收藏

    在Linux下编程习惯了使用命令行参数,故使用VS2010时也尝试了一下. 新建项目,c++编写程序如下: #include<iostream> #include<fstream&g ...

  3. egrep命令的实现 分类: 编译原理 2014-06-01 23:41 329人阅读 评论(0) 收藏

    本程序实现了egrep命令,首先将正则表达式转换为NFA,并实现模拟NFA的算法. 本程序使用flex实现词法分析,bison实现语法分析 若给定的一行字符串中存在一个字串能被该NFA接受,则输出整行 ...

  4. 递归查找无效的符号链接 分类: linux c/c++ 2014-06-02 00:14 345人阅读 评论(0) 收藏

    本程序实现在指定目录下递归查找无效的符号链接. 1.设计思路 逐个读取给定目录中的目录项,判断类型 (1)若为目录,则读取该目录中的目录项并判断类型: (2)若为链接文件,则读取出其指向文件的名称(绝 ...

  5. 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏

    在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺位置. 先看看效果图吧: 实现思路: 第一步:整理行政区域表: 要实现通过 ...

  6. C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏

    const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...

  7. 浅谈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 ...

  8. short-path problem (Spfa) 分类: ACM TYPE 2014-09-02 00:30 103人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> #include <queue> #i ...

  9. Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏

    #include<iostream> #include<cstdio> #include<algorithm> #define Max 1005 using nam ...

随机推荐

  1. 获取当前时间 YYYY-MM-DD

    1.函数封装 /** * 获取当前时间 * 格式YYYY-MM-DD */ Vue.prototype.getNowFormatDate = function() { var date = new D ...

  2. iOS开发-UITableView单选多选/复选实现1

    TableView怎样实现单选或者多选呢? 我们的直接思路是改动某一个Cell的样式就可以, 那么改动样式须要通过改动相应的数据, 从这里能够判断我们须要给Cell相应的数据设置一个标志位, 当选中的 ...

  3. webservice0基础

    在学习webservice的时候,常常将ns和url花了好久时间才理解过来,这里备份下. 首先定义接口: @WebService public interface IService { @WebRes ...

  4. 在类的头文件里尽量少引入其它头文件 &lt;&lt;Effective Objective-C&gt;&gt;

    与C 和C++ 一样,Objective-C 也使用"头文件"(header file) 与"实现文件"(implementation file)来区隔代码.用 ...

  5. Ant中批量调用TestNG的XML文件,并调用TestNgXlst生成漂亮的html测试报告

    from:http://blog.csdn.net/bwgang/article/details/7865184 1.在Ant中设置如下: <target name="run_test ...

  6. OpenTK的glutBitmapCharacter的替代方法

    由于openTK并没有打包集成GLUT,字体显示就成了一个问题. 办法1:采用QuickFont 优点:可以使用系统自带的字体 缺点:代码尚未成熟.只能2D显示,无法随物体旋转.平移 办法2:同时调用 ...

  7. Hibernate中二级缓存指的是什么?

    一.一级缓存.二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个se ...

  8. Installing Node.js via package manager

    https://nodejs.org/en/download/package-manager/

  9. 【转】jenkins上配置robotframeworkride自动化脚本任务

    jenkins上配置robotframeworkride自动化脚本任务 编写好的自动化脚本,集成在jenkins上进行自动运行于监控,这里采用分布式构建,在一台slave上进行任务构建与自动化脚本的运 ...

  10. hdu3092

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3092 题目描述:将一个数拆分成几个数之和,问这几个数能得到的最大的最小公倍数模上给定的一个数是多少? ...