https://github.com/Sranmi/WC.git
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

根据题目要求,要实现的内容大致如下:
-l 统计行数
支持各种文件
通过图形界面展现文件信息

下面用扩展功能的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";
        }
打开文件选择窗口,并且设置为单选。
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。
总结:通过这次个人完成的项目,了解了个人软件工程的设计流程,以及编程过程遇到的问题要在实践中逐步完善。软件工程每个流程的预计时间和设计,到具体的操作和实现,通过查找相关资料,对我这次的软件工程起到了很大的作用。
原文:https://www.cnblogs.com/huashengmi/p/9648217.html