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。
總結:經過此次我的完成的項目,瞭解了我的軟件工程的設計流程,以及編程過程遇到的問題要在實踐中逐步完善。軟件工程每一個流程的預計時間和設計,到具體的操做和實現,經過查找相關資料,對我此次的軟件工程起到了很大的做用。