此程序实现简化的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. XP 系统如何安装.NET Framework4.0

    1 运行CMD,然后输入命令net stop WuAuServ   2 打开C盘的Windows目录,然后找到SoftwareDistribution文件夹改名为SDold.   3 在CMD窗口中输 ...

  2. python菜鸟日记1

    1. 在__init__(self,...)初始化函数中.定义对象的属性,这些属性不用所有写在括号里,括号里的表示定义的时候须要赋初始值的一些属性,而其它不用初始值的属性.能够 直接卸载代码块中,se ...

  3. 在 Ubuntu 开启 GO 程序编译之旅

    本文将使用 putty 连接到一台阿里云 Ubuntu 16.04 服务器,在其上安装 go 语言的编译环境,旨在呈现从安装到"你好,世界!"涉及的方方面面,希望完成这个过程无须觅 ...

  4. 游戏server设计的一些感悟

    Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:September 30 ...

  5. 使用 C# 开发智能手机软件:推箱子(三)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第三篇.在这篇文章中,介绍 Common/Block.cs 源程序文件.   1 namespace Skyiv.Ben.Pu ...

  6. visio2010对齐粘附功能

    对齐与粘附功能在绘图时应用非常广泛.可以快速将图形对齐,以及将连接点准确地吸附在你想要连接的点上. 那么visio2010对齐粘附功能隐藏在什么地方呢? 你可以点击[视图]选项卡,在[视觉帮助]组中. ...

  7. GoodUI:页面布局的技巧和设计理念

    http://goodui.org/ 中文翻译:http://www.cnblogs.com/Wayou/p/goodui.html 一年了,小小少年从幼年期过渡到成长期要开始加速冲刺了.毕竟钻头就是 ...

  8. problem in Sourcetree

    1.The date is commit date not the date of author 2.The log line is ordered  by time, actually it sho ...

  9. Docker实现CentOS容器SSH远程登录

    Docker实现CentOS容器SSH远程登录 https://blog.csdn.net/A632189007/article/details/78625378 这里根据Dockerfile方式构建 ...

  10. 【转】axios全攻略

    随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文 ...