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(); } } }
各个子函数代码折叠,请点开查看
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)