WordCount軟體測試第三次作業
一、專案簡介
原始碼地址:https://gitee.com/rickeyqi/WordCount.git
專案需求:對程式設計語言原始檔統計字元數、單詞數、行數,統計結果以指定格式輸出到預設檔案中,可執行程式命名為:wc.exe。
該程式處理使用者需求的模式為:wc.exe [parameter] [input_file_name],儲存統計結果的檔案預設為result.txt,放在與wc.exe相同的目錄下。
wc.exe -c file.c //返回檔案 file.c 的字元數
wc.exe -w file.c //返回檔案 file.c 的單詞總數
wc.exe -l file.c //返回檔案 file.c 的總行數
wc.exe -o outputFile.txt //將結果輸出到指定檔案outputFile.txt
注: 空格,水平製表符,換行符,均算字元。
由空格或逗號分割開的都視為單詞,且不做單詞的有效性校驗,例如:thi#,that視為用逗號隔開的2個單詞。
-c, -w, -l引數可以共用同一個輸入檔案,形如:wc.exe –w –c file.c 。
-o 必須與檔名同時使用,且輸出檔案必須緊跟在-o引數後面,不允許單獨使用-o引數。
解題思路:該需求主要是對檔案進行操作,包括檔案的讀取、寫入、建立等,所以需要熟知檔案的基本操作,查閱相關資料也應向檔案操作方面靠攏。
資料統計和處理等作為資料基本操作不需要過多的查閱和修改。
程式碼思路:要實現上述四個功能,則需要四個獨立的方法來分別實現,主函式根據使用者輸入內容,識別使用者操作型別和檔名稱,再分別對各個操作進行處理。
-o操作不能獨立輸入,必須有處理結果才能執行,因此使用者輸入一條命令之後,程式不能立即結束。
二、專案實現
針對四個功能需求,設計了以下四個方法:
//返回檔案字元數 public static int CodeCount(string FileName) { int count = 0; char[] Code = { ' ', ',', '%', '~', '!', '#', '^', '*', '(', ')', '\t' }; //讀取檔案 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); foreach (string line in s) //行數 { foreach (Char a in line) //每行字元數 { foreach (char b in Code) { if (a == b) count++; } } } return count; }
//返回檔案單詞數 public static int WordCount(string FileName) { int sum = 0; //讀取檔案 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); foreach (string line in s) { if (line != null) { foreach (Char a in line) { if (a == ' ' || a == ',') sum++; } sum++; } } return sum; }
//返回檔案總行數 public static int LineCount(string FileName) { //讀取檔案 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); return s.Length; }
//將結果輸出到指定檔案 public static void OutPut(string ParmeterResult, string FileName) { string[] parResult = { ParmeterResult }; if (!File.Exists(@"..\Debug\" + FileName)) { //如果檔案不存在,則先新建檔案 FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(parResult); sw.Close(); } else { FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(parResult); sw.Close(); } }
注:為方便檢視程式處理結果,將資料寫入檔案時,採用的是向後新增的寫入方式,而不是覆蓋寫入方式
Main函式呼叫:
static void Main(string[] args) { string FileName; //檔名稱 string UserWrite; //使用者輸入內容 string[] ParName = new string[5]; //操作名稱 int[] ParmeterResult = new int[5]; //檔案操作的返回結果 UserWrite = Console.ReadLine(); string[] AllFileName = new string[50]; //儲存所有輸入過的檔名 string[] AllParName = new string[50]; //儲存所有操作名 int i = 0; while (UserWrite != "###") { string[] Parameter = UserWrite.Split(' '); //檔案執行操作型別 FileName = Parameter[Parameter.Length - 1]; AllFileName[i] = FileName; for (int j = 0; j < Parameter.Length - 1; j++) { if (Parameter[j] == "-c") //得到字元總數 { ParmeterResult[j] = CodeCount(FileName); ParName[j] = "字元數"; } else if (Parameter[j] == "-w") //得到單詞總數 { ParmeterResult[j] = WordCount(FileName); ParName[j] = "單詞數"; } else if (Parameter[j] == "-l") //得到總行數 { ParmeterResult[j] = LineCount(FileName); ParName[j] = "行數"; } else if (Parameter[j] == "-o") //將結果寫入檔案 { for(int k=0;k<=Parameter.Length-1;k++) { OutPut(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k], AllFileName[i]); Console.WriteLine(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k]); } continue; } Console.WriteLine(FileName + "," + ParName[j] + ":" + ParmeterResult[j]); } UserWrite = Console.ReadLine(); i++; } }
三、專案測試
目標檔案內容:
測試1:
測試2:
測試3:
測試4:
測試5:
測試6:
測試7:
測試8:
四、專案總結
專案完成了所有基本要求功能,但是程式碼的健壯性有待提高,沒有針對多種輸入進行正確的處理。