https://github.com/Sranmi/WC.gitgit
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具有其余扩展功能,并可以快速地处理多个文件。github
根据题目要求,要实现的内容大体以下:编程
-l 统计行数c#
支持各类文件函数
经过图形界面展示文件信息工具
下面用扩展功能的supercount举例说明,其余计算函数大体相同,都须要打开数据流。测试
/// <summary> /// 扩展功能:统计代码行、空行、注释行 /// </summary> /// <param name="sr"></param> /// <param name="notelinecount"></param> /// <param name="nulllinecount"></param> /// <param name="codelinecount"></param> public void SuperCount (string filename, ref int notelinecount,ref int nulllinecount,ref int codelinecount,ref string showdata) { //文件流打开文件读取字符 FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader sr = new StreamReader(fs); string line; while((line =sr.ReadLine ())!=null ) { line = line.Trim(' '); line = line.Trim('\t'); //空行 if(line ==""||line .Length <=1)//代码中单括号为空行 { nulllinecount++; } //注释行 else if(line.Substring (0,2)=="//"||line .Substring (1,2)=="//") { notelinecount++; } //代码行 else { codelinecount++; } } //读取完需关闭数据流 sr.Close(); //在字符串showdata增长计算结果 showdata += "代码行:" + codelinecount.ToString() + "\n" + "空行:" + nulllinecount.ToString() + "\n" + "注释行:" + notelinecount.ToString() + "\n"; }
打开文件选择窗口,而且设置为单选。this
private void OpenFile() { OpenFileDialog ofd = new OpenFileDialog(); ofd.InitialDirectory = "D:\\"; ofd.Filter = "全部文件|*.*|文本文件|*.txt"; ofd.RestoreDirectory = true; ofd.Multiselect = false;//一次只能选择单个文件 if (ofd.ShowDialog() == DialogResult.OK) { filename = ofd.FileName; } }
每次计算完后要清除数据,不然计算结果会累加上一次的数据。命令行
/// <summary> /// 输出一次数据后 将数据清零 /// </summary> private void ClearData() { this.charcount = 0; this.wordcount = 0; this.linecount = 0; showdata = null; }
界面“肯定“按钮,执行函数,以字符串的形式窗口输出数据结果,计算结束清除数据。设计
private void button2_Click(object sender, EventArgs e) { Operator(); if (showdata != null) MessageBox.Show(showdata); ClearData(); }
参数的判断流程,当参数为-x时要跳出循环,由于-x参数只能单独存在。
/// <summary> /// 查询总操做流程 /// </summary> private void Operator() { //读取用户输入的文件名和参数(其中多个参数以空格分开) filename = textBox2.Text; parameter = textBox1.Text.Split(' '); foreach (var s in parameter) { if (s != "-c" && s != "-w" && s != "-l" && s != "-s" && s != "-a" && s != "-x") { MessageBox.Show("参数输入有误,请从新输入,注意多参数之间必须用空格隔开"); break; } //参数-x输出图形界面选择文件并读取文件名 if (s == "-x") { OpenFile(); } //判断文件是否存在 if (File.Exists(filename)) { Function fc = new Function(); if (s == "-c" || s == "-x") { fc.CharCount(filename, ref charcount, ref showdata); } if (s == "-w" || s == "-x") { fc.WordCount(filename, ref wordcount, ref showdata); } if (s == "-l" || s == "-x") { fc.LineCount(filename, ref linecount, ref showdata); } if (s == "-a" || s == "-x") { fc.SuperCount(filename, ref notelinecount, ref nulllinecount, ref codelinecount, ref showdata); } } else { MessageBox.Show("文件名不存在,请从新输入"); break; } //参数为"-x"时只能单独使用,跳出循环 if (s == "-x") break; } }
WC窗口界面
测试文本
输入数据,支持多参数输入
弹出结果
当输入系数或者文件目录有误
当输入-x或者点击三点按钮时,弹出文件选择窗口,选择文件后,全部数据随即输出。
计算扩展-a功能
项目过程当中遇到的困难:
1.项目是要用命令行的形式仍是window窗口应用来实现,最后选择了视觉上较美观的window窗口应用。
2.构思基本功能函数结构时,三个函数分开的话,数据流须要分别执行,但函数能够单独计算,最后选择了单独计算。
3.参数判断时,循环遇到-x时要跳出,以及要如何实现计算函数的运行,最后以计算函数为出发点,符合条件的函数即执行。
4.数据结果该如何呈现,弹出另一个窗口相比直接输出messagebox较难,最后用字符串在messagebox上执行。
5.运行计算第二次时,发现数据呈叠加状态,即添加一个数据清空函数CleanData。
总结:经过此次我的完成的项目,了解了我的软件工程的设计流程,以及编程过程遇到的问题要在实践中逐步完善。软件工程每一个流程的预计时间和设计,到具体的操做和实现,经过查找相关资料,对我此次的软件工程起到了很大的做用。