一个Word Count程序,由c++完成,有行数、词数、能完成路径下文件的遍历。
遍历文件部分的代码如下:
void FindeFile(wchar_t *pFilePath) { CFileFind finder; CString Finddir; Finddir.Format(pFilePath); BOOL ret = finder.FindFile(Finddir); while (ret) { ret = finder.FindNextFile(); CString strPath = finder.GetFilePath(); if (finder.IsDirectory()) { wchar_t *temp = strPath.GetBuffer(0); temp += strPath.GetLength(); while (*temp != ('\')) { temp--; } CString Filename = temp; if (Filename == "\." || Filename == "\..") continue;//如果是目录不处理 else { FindeFile(strPath.GetBuffer(0)); //TRACE("目录:%s ", strPath); } } else { //TRACE("文件:%s ", strPath); wchar_t *test; char *TEST; test = strPath.GetBuffer(strPath.GetLength()); TEST = WtoC(test); cout << " 文件" << TEST << endl; ReadFile(TEST); } } finder.Close(); }
仍然是上次的问题,使用一些MFC的函数时,不可避免会使用到wchar_t类型的,为此写了两个函数WtoC与CtoW来实现两种字符类型字符串的互相转换,代码如下:
char* WtoC(wchar_t *a) { char* TEST; size_t len = wcslen(a) + 1; size_t converted = 0; TEST = (char*)malloc(len*sizeof(char)); wcstombs_s(&converted, TEST, len, a, _TRUNCATE); return TEST; } wchar_t* CtoW(char *a) { size_t len = strlen(a) + 1; size_t converted = 0; wchar_t *test; test = (wchar_t*)malloc(len*sizeof(wchar_t)); mbstowcs_s(&converted, test, len, a, _TRUNCATE); return test; }
一开始写完时出现了遍历出来的文件名无法转换,不止无法转换,连输出都输出不了。卡在这一部分许久,至今未知其原因(过后此问题又莫名消失了)今后还是尽量少用两种字符类型字符串混用的程序。
查找行数、词数部分的代码就不贴了,写的图森破没什么好说的。
功能控制上使用了命令行参数,第一次使用这种方式。main函数如下:
int main(int argc, char* argv[]) { char *filet = "d: est .txt"; Wc wctest; if (argv[1][1] == 's') { filet = argv[2]; wchar_t* F; F = CtoW(filet); wctest.mod = 'o'; wctest.HL = 1; wctest.FindeFile(F); cin >> filet; return 1; } if (argc == 1) { cout << "缺少参数!" << endl; } else if (argc == 2) { wctest.mod = 'o'; wctest.HL = 1; filet = argv[1]; } else if (argc == 3) { wctest.mod = argv[1][1]; wctest.HL = 0; filet = argv[2]; } else if (argc == 4) { wctest.mod = argv[1][1]; if (argv[2][1] == 'a') wctest.HL = 1; else wctest.HL = 0; filet = argv[3]; } wctest.ReadFile(filet); cin >> filet; return 0; }
参数中 -l 为行数检查、-w为词数检查,-c为字符数检查,-a为高级模式(空行、注释行、代码行),-o为全输出模式,-s为遍历模式。
在参数如下时
对如下的文件夹:
遍历结果如下:
没有对子路径下的文件继续遍历。