您的位置:首页 > 编程语言

mycat命令——cat命令的自我代码实现

2012-01-02 21:03 253 查看


mycat命令——cat命令的自我代码实现

  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;

charch;

inti=1;

main(intargc,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);

}

elseif(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,欢迎各种的改动和引用。

___________________________________________________________________

欢迎各种转载、引用,但请保留以下文字:

转载自光光_IT(贾耀光)的DiscoveryWorld (http://sunsun.cnblogs.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: