wc命令的C语言实现_lichenghui_的博客-程序员宝宝

技术标签: C/C++  diy小程序  Linux  C语言  

该程序实现了wc的 -l -m -c -L -w这五个参数的(可组合使用)功能,首先关于其参数man的定义如下:

-c, --bytes  print the byte counts	//字节数	
 -m, --chars print the character counts		//字符数
-l, --lines print the newline counts		//行数
-L, --max-line-length print the length of the longest line	//最大行长度
 -w, --words print the word counts 	//单词数
源代码如下:
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<stdlib.h>
struct message{
		int lines;
		int words;
		int max_line_length;
		int size;
		int chars;
}info;
void error_print(char str[]){
		printf("Error:%s",str);
}
void init(char filename[]){
		struct stat get_message = {};
		FILE *fp;
		int ret_stat = stat(filename,&get_message);/*用stat函数读取filenmae文件的信息,并将结果写到get_message结构体中*/
		if(ret_stat == -1){//stat函数不出错则进行信息输出
				error_print(filename);
				return ;
		}
		mode_t mode = get_message.st_mode;		//接收文件信息,用于下面判断是不是目录
		int length = 0;
		if(S_ISDIR(mode))	//如果是目录,输出错误
				printf("Error %s is dir\n0\t0\t0\t%s",filename,filename);
		else{
				info.size = get_message.st_size;	//文件字节大小 wc -c
				fp = fopen(filename,"r");	//以只读方式打开指定文件
				char ch;
				int flag = 0;
				while((ch = fgetc(fp))!=EOF){	//一直读到文件尾
						info.chars++;		//字符数加1 wc -m

						if(ch != '\n'){

								length++;	//记录当前行的长度 wc -L
						}
						if(ch == '\n'){
								info.lines ++;	//行数加1 wc -l
								if(length>info.max_line_length)
										info.max_line_length = length;	//更新最大长度
								length = 0;
						}
						if(ch == '\t' || ch == ' ' || ch == '\n'){
								flag = 0;		//计算单词数 wc -w
								continue;
						}
						else{

								if(flag == 0){
										info.words++;	//计算单词数 wc -w
										flag = 1;
								}
						}
				}
				fclose(fp);
		}

}
//计算键盘输入内容的相关信息,即参数中没有指定要打开的文件
void EmptyFile(){
		char ch;
		int flag = 0;
		int length = 0;

		while((ch = getchar())!=EOF){
				info.chars++;
				info.size += sizeof(ch);	//字节累加
				if(ch != '\n'){
						length++;
				}
				if(ch == '\n'){
						info.lines ++;
						if(length>info.max_line_length)
								info.max_line_length = length;
						length = 0;
				}
				if(ch == '\t' || ch == ' ' || ch == '\n'){
						flag = 0;
						continue;
				}
				else{

						if(flag == 0){
								info.words++;
								flag = 1;
						}
				}

		}
}
int main(int argc,char *argv[]){

		if(argc == 2){
				if(argv[1][0] != '-'){
						init(argv[1]);
						printf("%d %d %d %s\n",info.lines,info.words,info.size,argv[1]);
						return 0;
				}
				else{	//未指定打开文件,类似 wc -lmwcL
						EmptyFile();

				}
		}
		else if(argc == 1){		//未指定打开文件和要输出的参数,(默认输出 -lwc)
				EmptyFile();
				printf("%d\t%d\t%d\n",info.lines,info.words,info.size);
				return 0;
		}
		else if(argc == 3){
				init(argv[2]);
		}
		int num;
		while((num = getopt(argc,argv,"lwmcL"))!=-1){
				switch(num){
						case 'l':
								printf("%d\t",info.lines);
								break;
						case 'w':
								printf("%d\t",info.words);
								break;
						case 'm':
								printf("%d\t",info.chars);
								break;
						case 'c':
								printf("%d\t",info.size);
								break;
						case 'L':
								printf("%d\t",info.max_line_length);
								break;
				}
		}
		if(argc != 2 && argv[1][0] != '-')	//一定要判断,否则会越界
				printf("%s\n",argv[2]);


		return 0;
}


运行结果如下:



如果对文件进行操作,在参数选项后面加上文件名即可,注意要加绝对路径

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Rookie_Or_Veteran/article/details/78151513

智能推荐

微软推出DLR, Silverlight,和IronRuby了_g9yuayon的博客-程序员宝宝

 MiX07上宣布的。DLR =  Dynamic Language Runtime。DLR和IronPython全部开源,可以到codeplex下载。有了DLR,在.NET上开发动态语言的工作可以简化许多。目前DLR支持Python, Ruby, JavaScript,和VB,只能在Silverlight下运行。不过把支持面扩展到普通CLR运行时应该只是时间问题。微软的CLR已是牛B的运行时,有

mysql8.0 malloc_mysql8.0.20 二进制安装_weixin_39541869的博客-程序员宝宝

关闭selinuxsed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/configsetenforce 0修改系统限制参数cat &gt;&gt; /etc/security/limits.conf &lt;&lt; EOF####custom#* soft nofile 20480* ...

Qt封装的QDateTime日期时间类(7)_Lsa_BigDevil的博客-程序员宝宝_qt datetime

Qt封装的QDateTime日期时间类非常强大,可以字符串和日期时间相互转换,也可以毫秒数和日期时间相互转换,还可以1970经过的秒数和日期时间相互转换等。

matlab、python中矩阵的互相导入导出_cageyoko的博客-程序员宝宝_sio.loadmat是倒入一个矩阵吗

还有一种最流行的h5py.. 过几天更新------------------在python中导出矩阵至matlab------------------------------如果矩阵是mxn维的。 那么可以用 :np.savetxt('dev_ivector.csv', dev_ivector, delimiter = ',')对应matlab读取为:dev_i...

_stdcall与_cdecl的区别_机器视觉001的博客-程序员宝宝_stdcall与cdecl

_stdcall与_cdecl的区别  最大的区别就是__cdecl是由调用函数者释放堆栈,而__stdcall由被调用者释放。但是在调用任一种函数时,都没有进行显示的释放堆栈工作。这个工作由编译器完成,它帮我们生成了这个中间要使用的代码。在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)...

SpringBoot使用Google guava缓存_He Yanbo的博客-程序员宝宝

Springboot使用Google guava缓存开发环境springbootguavadocker-client应用场景用来存储DockerClient的client连接,项目通过操作docker-client提供对docker的可视化界面操作,操作范围没有固定,可以是当前k8s集群上的任意节点,或者是任意主机的docker,所以只能根据接口传递的主机ip和docker....

随便推点

ART 和 Dalvik的区别_yzpyzp的博客-程序员宝宝_art和dalvik的区别

主要如下:1、Ahead-of-time (AOT) compilation instead of Just-in-time (JIT)2、Improved garbage collection3、Improved memory usage and reduce fragmentationart和dalvik的区别?https://source.android.google.cn/devices/tech/dalvik/http://source.android.com/devices/tech

docker命令(一) —— docker logs 日志输出_普通网友的博客-程序员宝宝_docker输出日志

docker的运行的时候我们喜欢采用 -d 的命令来启动docker容器,这就导致了一个问题,无法直接看到docker运行日志,只能去后台进去找到日志文件查看,好在docker给了日志查看的命令,可以让我们很容易的看到日志的输出 docker logs。命令语法docker logs [OPTIONS]容器名[容器id]例如: docker logs nginx这个是比较简单的使用(查看nginx的docker运行日志),直接进行日志的查看,通过这个命令我们可以看到已经输出的日志,无法实时查看

转--android Toast大全(五种情形)建立属于你自己的Toast_孙瑞宇的博客-程序员宝宝

  Toast用于向用户显示一些帮助/提示。下面我做了5中效果,来说明Toast的强大,定义一个属于你自己的Toast。1.默认效果代码Toast.makeText(getApplicationContext(), "默认Toast样式",Toast.LENGTH_SHORT).show();2.自定义显示位置效果代码toast = Toast...

CodeForces 715 B.Complete The Graph(Dijkstra)_v5zsq的博客-程序员宝宝

Description 一个n个点m条边的无向图,每条边有正边权,0边权表示可以修改该条边的边权为任意正整数,给出起点s和终点t,问是否有一种修改边权的方案使得s到t的最短路为L Input 第一行五个整数n,m,L,s,t分别表示点数,边数,要求的最短路的长度,起点和终点,之后m行每行三个整数u,v,c表示u和v之间有一条权值为c的边,如果c=0表示该条边的边权可以被修改(2&amp;lt;=n&amp;...

[最小费用流]zoj 3308:Move the Knights_sdau_09j1_xcy的博客-程序员宝宝

大致题意:    一个国际象棋棋盘上有n个马分布在不同的黑色格子上,这些棋子共有三种,“金马”移动的能量损耗是P(row1,col1) x P(row2,col2),“银马”是P(row1,col1) + P(row2,col2),铜马是max(P(row1,col1) , P(row2,col2))。现在允许n个棋子中有k个棋子移动一步,求移动的马数量最多时最少能量消耗是多少。 大致...

PyCharm 导入 cv2_大黑山修道的博客-程序员宝宝_pycharm导入cv2

windows下1.情况一:已在官网下载opencv无需下载,只需要导入环境即可;1.首先,在opencv目录中找到cv2文件夹:opencv3.4.8\opencv\build\python\cv2复制文件夹2.找到Python的根路径,在项目列表可查看(以实际显示的路径为主):在python.exe目录下找到 Lib\site-packages,粘贴文件夹2.情况二:下载并...

推荐文章

热门文章

相关标签