word count程序,以及困扰人的宽字符与字符

一个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\r\n", strPath);
                }
            }
            else
            {
                //TRACE("文件:%s\r\n", strPath);
                wchar_t *test;
                char *TEST;
                test = strPath.GetBuffer(strPath.GetLength());
                TEST = WtoC(test);
                cout << "\n\n文件" << TEST << endl;
                ReadFile(TEST);
            }
        }
        finder.Close();
    }
View Code

仍然是上次的问题,使用一些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;
}
View Code

一开始写完时出现了遍历出来的文件名无法转换,不止无法转换,连输出都输出不了。卡在这一部分许久,至今未知其原因(过后此问题又莫名消失了)今后还是尽量少用两种字符类型字符串混用的程序。

查找行数、词数部分的代码就不贴了,写的图森破没什么好说的。

功能控制上使用了命令行参数,第一次使用这种方式。main函数如下:

int main(int argc, char* argv[])
{
    char *filet = "d:\test\t.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;
}
View Code

参数中 -l 为行数检查、-w为词数检查,-c为字符数检查,-a为高级模式(空行、注释行、代码行),-o为全输出模式,-s为遍历模式。

在参数如下时

对如下的文件夹:

遍历结果如下:

 

没有对子路径下的文件继续遍历。

 

posted @ 2016-03-21 18:49  DoubleX  阅读(264)  评论(1编辑  收藏  举报