实践最简单的项目:WC
wc.exe是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数、单词数和行数。
给实现一个统计程序,它能正确统计程序文件的字符数、单词数、行数,以及其他扩展功能,并能够快速的处理多个文件。
就这样,代码如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <io.h>
void open_file(int a,int b,int c,int d,char data[]);
FILE *letter(FILE *fp1,char ch1);
FILE *message(FILE *fp1,char ch2);
FILE *null(FILE *fp1,char ch3);
void printDir( const char* path );
char str1[],str3[];
int word_N=,line_N=,ch_N=;//记录单词数、行数、字符数
int null_h=,code_h=,mess_h=;//记录空行、代码行、注释行
int s_ch=,s_word=,s_line=,hang_a=,s_s=;//记录输入的查询数据
int main ()
{
char s[];
gets(s);
while()
{
memset(str1, , sizeof(str1));
memset(str3, , sizeof(str3));
word_N=,line_N=,ch_N=,null_h=,code_h=,mess_h=;
s_ch=,s_word=,s_line=,hang_a=,s_s=;
int length_s=;
length_s=strlen(s);
int i=;
for(i=;i<length_s;++i)
{
if((s[i]=='-')&&(s[i+]=='c'))
{
s_ch=;
}
if((s[i]=='-')&&(s[i+]=='w'))
{
s_word=;
}
if((s[i]=='-')&&(s[i+]=='l'))
{
s_line=;
}
if((s[i]=='-')&&(s[i+]=='a'))
{
hang_a=;
}
if((s[i]=='-')&&(s[i+]=='s'))
{
s_s=;
}
if(s[i]=='F'){
strncpy(str1,s+i,length_s-i);
strcpy(str3,str1);
break;
}//获取文件名
}
if(s_s==)
{
s_ch=;
s_word=;
s_line=;
hang_a=;
printDir(str1);
}
else open_file(s_ch,s_word,s_line,hang_a,str1); printf("\n");
gets(s);
}
return ;
}
void printDir( const char* path )
{
struct _finddata_t data; long hnd = _findfirst( path, &data ); // 查找文件名与正则表达式chRE的匹配第一个文件
if ( hnd < )
{
perror( path );
}
int nRet = (hnd < ) ? - : ;
while ( nRet >= )
{
if ( data.attrib == _A_SUBDIR ) // 如果是目录
{
printf("文件名:[%s]*\n", data.name );
open_file(s_ch,s_word,s_line,hang_a,data.name );
}
else
{
printf("文件名:[%s]\n", data.name );
open_file(s_ch,s_word,s_line,hang_a,data.name);
}
nRet = _findnext( hnd, &data );
}
_findclose( hnd ); // 关闭当前句柄
}
void open_file(int a,int b,int c,int d,char data[])
{
word_N=,line_N=,ch_N=,null_h=,code_h=,mess_h=;
int i=,length_str3=,j=;
length_str3=strlen(str3);
char str2[];
memset(str1, , sizeof(str1));
strcpy(str1,str3);
for(i=;i<length_str3;++i)
{
if(str3[]==data[])
{
strcpy(str2,str3);
break;
}//当未输入指令-s时,直接打开str1
else if(str3[i]=='*')
{
for(;i<length_str3;++i)
str1[i]='\0';
strcat(str1,data);
printf("文件位置:%s\n", str1);
strcpy(str2,str1);
break;
}
}
FILE *fp;
fp=fopen(str2,"r");
if(fp==NULL){
printf("the file not found\n");
exit();
}//打开地址文件
char ch;
ch=fgetc(fp);
ch_N++;
if(ch==EOF)
ch_N--;
while(ch!=EOF)
{
switch(ch)
{
case ' ':fp=null(fp,ch);break;
case '{':fp=null(fp,ch);break;
case '}':fp=null(fp,ch);break;
case '/': fp=message(fp,ch);break;
default :fp=letter(fp,ch);break;
}
ch=fgetc(fp);
ch_N++;
if(ch==EOF)
ch_N--;
} if(a==)
printf("字符数:%d\n",ch_N);
if(b==)
printf("单词数:%d\n",word_N);
if(c==)
printf("总行数:%d\n",line_N);
if(d==)
{
printf("代码行:%d\n",code_h);
printf("注释行:%d\n",mess_h);
printf("空行:%d\n",null_h);
}
}
FILE *message(FILE *fp1,char ch2)
{
char ch_2;
ch_2=fgetc(fp1);
ch_N++;
if(ch_2=='/')
{
ch_2=fgetc(fp1);
ch_N++;
while((ch_2!='\n')&&(ch_2!=EOF))
{
ch_2=fgetc(fp1);
ch_N++;
}//换行时输出
ch_2=fgetc(fp1);
ch_N++;
mess_h++;
line_N++;//注释行+1,总行数+1,获取\n之后的下一个字符;
if(ch_2==EOF)
{
ch_N--;
return fp1;
}
}
fseek(fp1,-,);
ch_N--;
return fp1;
}//注释函数
FILE *null(FILE *fp1,char ch3)
{
char ch_3;
ch_3=ch3; if((ch_3=='{')||(ch_3=='}'))
{
ch_3=fgetc(fp1);
ch_N++;
if(ch_3=='\n')
{
null_h++;
line_N++;
ch_3=fgetc(fp1);
ch_N++;
}
}
if(ch_3==EOF)
{
ch_N--;
null_h++;
line_N++;
return fp1;
} while((ch_3==' '))
{
ch_3=fgetc(fp1);
ch_N++;
}
if(ch_3=='\n')
{
null_h++;
line_N++;
ch_3=fgetc(fp1);
ch_N++;
}
fseek(fp1,-,);
ch_N--;
return fp1;
}//空行函数
FILE *letter(FILE *fp1,char ch1)
{
char ch_1;
ch_1=ch1;
if(isalpha(ch_1))
{
ch_1=fgetc(fp1);
ch_N++;
while((isalpha(ch_1))||(isdigit(ch_1)))
{
ch_1=fgetc(fp1);
ch_N++;
}
word_N++;
}//字母型单词
else if(isdigit(ch_1))
{
ch_1=fgetc(fp1);
ch_N++;
while((isdigit(ch_1))||(isalpha(ch_1)))
{
ch_1=fgetc(fp1);
ch_N++;
}
word_N++;}//数字型单词
else if(ch_1=='\n')
{
code_h++;
line_N++;
ch_1=fgetc(fp1);
ch_N++;
}
else if(ch_1==EOF)
{
ch_N--;
return fp1;
}
else
{
ch_1=fgetc(fp1);
ch_N++;
}
fseek(fp1,-,);
ch_N--;
return fp1;
}
实践最简单的项目:WC的更多相关文章
- 实践简单的项目WC
#include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...
- 个人项目-wc
个人项目-WC (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
- OK 开始实践书上的项目一:即使标记
OK 开始实践书上的项目一:及时标记 然而....又得往前面看啦! ----------------------我是分割线------------------------ 代码改变世界
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...
- Intellij创建简单Springboot项目
Intellij创建简单Springboot项目 第一步:选择创建新项目——file-new-project 第二步:选择项目类型——Spring Initializr-next 第三步:输入项目信息 ...
- Hibernate入门2.简单的项目开发实例
Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...
- Ant—使用Ant构建简单Java项目(三)
博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...
- javaWEB简单商城项目
javaWEB简单商城项目(一) 项目中使用到了上一篇博文的分页框架,还有mybatis,重点是学习mybatis.现在有些小迷茫,不知道该干啥,唉,不想那么多了,学就对了 一.项目功能结构 1.功能 ...
随机推荐
- NPOI读取Excel 数据 转。。。
public DataTable am_Decode() { DataTable table = new DataTable(); string[] strAscDataList = Direct ...
- 十个最适合 Web 和 APP 开发的 NodeJS 框架
在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来 ...
- mysql登录不了及修改密码
安装mariadb,默认是无密码的,但一般是指要设置密码的.在设置密码时出现各种问题,可能还是不太明白其原理. 一下我尝试了两种方法,但都失败了.下面这两个是我尝试的方法: 一.网上最多的方法是 1. ...
- ASP.NET MVC3 实现用户登录验证
自定义一个授权筛选器类,继承于AuthorizeAttribute: using System; using System.Web; using System.Web.Mvc; namespace M ...
- android 瀑布流效果 保存地址
http://tech.ddvip.com/2013-09/1379785198203013_2.html
- qt 设置等待事件
QElapsedTimer et;et.start();while(et.elapsed() < 1000) QCoreApplication::processEvents();
- zookeeper的安装(图文详解。。。来点击哦!)
zookeeper的安装(图文详解...来点击哦!) 一.服务器的配置 三台服务器: 192.168.83.133 sunshine 192.168.83.134 sunshineMin 19 ...
- SQL_函数
五毛叶 — SQL_函数: 如下: 1 SQL_Aggregate函数 AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回第一个记录的值 LAST() - 返回最后一个 ...
- js中toString和valueOf方法的区别
toString 方法 返回对象的字符串表示形式. 语法:objectname.toString([radix]) objectname 必需.要为其搜索字符串表示形式的对象. radix 可选.为将 ...
- java 枚举类型 构造函数及用法
// 1. 定义枚举类型 public enum Light { // 利用构造函数传参 RED (1), GREEN (3), YELLOW (2); // 定义私有变量 private int n ...