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.行数、空行数
这就需要回车标志“\n”了,(ch = getc(fp)) != '\n',经过判断sum++,行数就可以正确输出,还有空行,那就要判断整行字符除了"\n",其他字符都不需要有了呗,也就是说当整行字符为0时,就是空行了。为了方便查看字符个数,我添加了每行有多少字符的功能,要注意字符数要注意剪掉前几行的字符数。
for (; num<=len;) { if ((ch = getc(fp)) != '\n') { cout << ch; num++; } else { cout << "\n"; sum++; cout <<"第"<< sum << "行" << "一共有" <<num-1-front<< "个字符" << "\n"; if (num - 1 - front == 0) empty++; front = num; } }
3.单词查找:
以我对单词的理解,由字母组成,那就可以通过ASCII码来表示,其范围为(ch>='A'&&ch<='Z') || (ch >= 'a' && ch <= 'z')。将其存在数组中,记录长度,在数组末尾加“\0”,便于查找。若想实现单词出现在哪一行,在比较成功后,count++就可以了。
while ((ch = getc(fp)) != EOF) { //EOF 表示文件结束 if (ch == '\n') line++; if ((ch>='A'&&ch<='Z') || (ch >= 'a' && ch <= 'z')) { temp[m] = ch; m++; } else { temp[m] = '\0'; if ((strcmp(find, temp)) == 0) { count++; if(flag==0) cout << "出现在第" << line ; else cout << "、" << line ; flag = 1; } m = 0; }
总的来说,这个程序不是太难,但要考虑的东西很多,再出现问题的时候,耐下心来,认真调试一下,就会找到出错的地方。