tac命令的实现

此程序实现简化的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。
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聚沙塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值