09年夏天的小程序,今天把它转更到这个博客上面。

 

  mycat命令所要实现的功能类似与系统的cat命令,使用shell脚本语言来实现,下面就简要地说明cat命令的功能:
  

  用法:cat [选项] [文件]...
  将[文件]或标准输入组合输出到标准输出。

  -A,   --show-all 等同于 -vET,将文件内容完全显示出来
  -b,   --number-nonblank 对非空输出行编号
  -e,   --等同于 -vE
  -E,   --show-ends 在每行结束处显示 $
  -n,   --number 对输出的所有行编号
  -s,   --squeeze-blank 不输出多行空行
  -t,   --与 -vT 等价
  -T,   --show-tabs 将跳格字符显示为 ^I
  -v,   --show-nonprinting 列出一些看不见的字符

  说明:关于cat还有其他参数,比如--help,--version, -u等等。这里只是列出了比较常见的几个参数。各位可以根据情况尽可能多的实现上述的参数。

 

  以上是cat命令的一些基本的功能,新成员在实现的不必要将每个功能实现,有些功能不是很常用,就没有必要去实现了,但是你可以扩展mycat的功能,而不是仅仅停留在cat命令本身。

 

以下是我的mycat命令的实现:

 

#include<stdio.h>
#include<stdlib.h>
FILE *fp;
char ch;
int i=1;
main(int argc,char **argv)
{
  if(argc==1||argc>3)
  { printf("命令用法错误\n该命令当且仅当接一个参数和文件名的时候使用\n用法:cat [选项] [文件]\n目前实现有linux下cat命令的-A -b -e -n -s -T和直接接文件名。\n-A,将文件内容完全显示出来\n-b,对非空输出行编号\n-e,在每行结束处显示 $\n-n,对输出的所有行编号\n-s,不输出多行空行\n-T,将跳格字符显示为 ^I\n");
    exit(1);
  }
  else
  { fp=fopen(*(argv+argc-1),"r");
    if(fp==NULL)
    { printf("不能打开%s这个文件\n如需帮助请直接输入命令 \n",*(argv+argc-1));
      exit(1);
     }   
    else if(argc==2)
    { ch=fgetc(fp);
      while((ch=fgetc(fp))!=EOF) printf("%c",ch);
      fclose(fp);
      printf("\n");
     }
    else
    {  if(strcmp(*(argv+1),"-A")==0) mycat_A();
     if(strcmp(*(argv+1),"-b")==0) mycat_b();
    if(strcmp(*(argv+1),"-e")==0) mycat_e();
    if(strcmp(*(argv+1),"-n")==0) mycat_n();
    if(strcmp(*(argv+1),"-s")==0) mycat_s();
    if(strcmp(*(argv+1),"-T")==0) mycat_T();
     }
   }
}  

 

各个子函数代码折叠,请点开查看

 

子函数代码
1 void mycat_A()
2 { ch=fgetc(fp);
3 while((ch=fgetc(fp))!=EOF)
4 { if(ch=='\n') printf("$");
5 if(ch==9)
6 { printf("^I");
7 continue;
8 }
9 printf("%c",ch);
10 }
11 fclose(fp);
12 printf("\n");
13 }
14
15  void mycat_b()
16 { char tmp='\n';
17 ch=fgetc(fp);
18 while((ch=fgetc(fp))!=EOF)
19 { if(tmp=='\n'&&ch!='\n')
20 { printf("%d %c",i++,ch);
21 tmp=ch;
22 continue;
23 }
24 tmp=ch;
25 printf("%c",ch);
26 }
27 fclose(fp);
28 printf("\n");
29 }
30
31  void mycat_e()
32 { ch=fgetc(fp);
33 while((ch=fgetc(fp))!=EOF)
34 { if(ch=='\n') printf("$");
35 printf("%c",ch);
36 }
37 fclose(fp);
38 printf("\n");
39 }
40
41  void mycat_n()
42 { ch=fgetc(fp);
43 printf("%d ",i);
44 while((ch=fgetc(fp))!=EOF)
45 { if(ch=='\n')
46 { printf("\n%d ",++i);
47 continue;
48 }
49 printf("%c",ch);
50 }
51 fclose(fp);
52 printf("\n");
53 }
54
55  void mycat_s()
56 { char tmp='\n';
57 ch=fgetc(fp);
58 while((ch=fgetc(fp))!=EOF)
59 { if(ch=='\n'&&tmp=='\n') tmp=ch;
60 else
61 { tmp=ch;
62 printf("%c",ch);
63 }
64 }
65 fclose(fp);
66 printf("\n");
67 }
68
69  void mycat_T()
70 { ch=fgetc(fp);
71 while((ch=fgetc(fp))!=EOF)
72 { if(ch==9)
73 { printf("^I");
74 continue;
75 }
76 printf("%c",ch);
77 }
78 fclose(fp);
79 printf("\n");
80 }

 

 

 

如需下载整个文件,请点击下载mycat.c

 

本程序开放源代码,遵守GNU,欢迎各种的改动和引用。