tac命令

1359阅读 0评论2012-11-04 lys5300
分类:LINUX

    tac命令,就是cat的反向。即将一个文件的最后一行作为第一行输出,其它依次类推。使用fseek设置文件读取的开始位置,然后依次改变这个值,并判断是否为换行符。代码如下:


点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<strings.h>

  3. #define MAX_SIZE 1024

  4. /* 将一个文件的最后一行作为第一行输出,依次输出逆序的文件*/

  5. static int
  6. ReverseFile(const FILE *in){
  7.     FILE *fp = in;
  8.     long cur,start;
  9.     char buf[MAX_SIZE] = { 0 }; // 作为读取文件的缓冲
  10.     char c;
  11.     long i = -2;

  12.     start = ftell (fp);
  13.     fseek (fp,-2l,SEEK_END); // 将文件指针指向最后一个字符,并不是 eof ,并不会改变fp的值
  14.     cur = ftell (fp);

  15.     while (cur >= start){
  16.         c = fgetc (fp);
  17.         if (cur == 0 || c == '\n'){
  18.             fgets (buf,MAX_SIZE,fp);
  19.         }
  20.         if (cur == 0){ // 为了解决第一行为换行的情况
  21.             fseek (fp,0l,SEEK_SET);// fgetc 读取的字符为当前cur后一个字符,所以将读取位置置为开始
  22.             c = fgetc (fp); // 读取第一个字符
  23.             if (c != '\n') // 判断第一个字符是什么字符,根据是否为换行符做出相应的决策
  24.             {
  25.                 fprintf (stdout,"%c",c);
  26.                 fprintf (stdout,"%s",buf);
  27.             }
  28.             else{
  29.                 fprintf (stdout,"%s",buf);
  30.                 fprintf (stdout,"%c",c);
  31.             }
  32.             break;
  33.         }
  34.         fprintf (stdout,"%s",buf);
  35.         bzero (buf,MAX_SIZE);
  36.         fseek (fp,--i,SEEK_END);
  37.         cur = ftell (fp);
  38.     }
  39.     return 0;
  40. }

  41. int
  42. main(int argc,char* argv[])
  43. {
  44.     FILE *file;

  45.     if (argc != 2)
  46.         return -1;

  47.     file = fopen (argv[1],"r");

  48.     if (file == NULL)
  49.     {
  50.         perror ("Error");
  51.         return -1;
  52.     }

  53.     ReverseFile (file);
  54.     fclose (file);

  55.     return 0;
  56. }


上一篇:关于合并两个有序数组
下一篇:没有了