word count

需求分析:

1.通过输入文件名,实现文件内容读取

2.统计文件内容字符数、行数、空行数、每行字符数、单词查找

如何实现:

1.文件部分

在大一上c语言时,简单的学了学文件,于我而言,不是很常用。于是百度了下文件读取,感觉调用库函数,棒棒的!

    fseek(fp, 0L, SEEK_END); //把指针移动到文件的结尾 ,获取文件长度
    int len = ftell(fp); //获取文件长度
    pBuf = new char[len + 1]; //定义数组长度
    rewind(fp); //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错
    fread(pBuf, 1, len, fp); //读文件
    pBuf[len] = 0; //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束

把文件读到数组中可以基本解决,若读到文件尾,文件指针需要前移的问题,不过我还是比较喜欢用指针,代码中rewind(fp);就可以移动文件指针

在每次读文件前,粘进去,特别好。

2.行数、空行数

这就需要回车标志“ ”了,(ch = getc(fp)) != ' ',经过判断sum++,行数就可以正确输出,还有空行,那就要判断整行字符除了" ",其他字符都不需要有了呗,也就是说当整行字符为0时,就是空行了。为了方便查看字符个数,我添加了每行有多少字符的功能,要注意字符数要注意剪掉前几行的字符数。

    for (; num<=len;)
    {
        if ((ch = getc(fp)) != '
')
        {
            cout << ch;
            num++;
        }
        else
        {
            cout << "
";
            sum++;
            cout <<""<< sum << "" << "一共有" <<num-1-front<< "个字符" << "
";
            if (num - 1 - front == 0)
                empty++;
            front = num;
        }    
    }

 

3.单词查找:

以我对单词的理解,由字母组成,那就可以通过ASCII码来表示,其范围为(ch>='A'&&ch<='Z') || (ch >= 'a' && ch <= 'z')。将其存在数组中,记录长度,在数组末尾加“”,便于查找。若想实现单词出现在哪一行,在比较成功后,count++就可以了。

    while ((ch = getc(fp)) != EOF)
    {  //EOF 表示文件结束
        if (ch  == '
')
            line++;
        if ((ch>='A'&&ch<='Z') || (ch >= 'a' && ch <= 'z'))
        {
            temp[m] = ch;
            m++;
        }
        else
        {
            temp[m] = '';
            if ((strcmp(find, temp)) == 0)
            {
                count++;
                if(flag==0)
                    cout << "出现在第" << line ;
                else
                    cout << "" << line ;
                flag = 1;
            }
            m = 0;
        }

总的来说,这个程序不是太难,但要考虑的东西很多,再出现问题的时候,耐下心来,认真调试一下,就会找到出错的地方。

原文地址:https://www.cnblogs.com/wxl530/p/5308976.html