用状态机进行文件字符分析的程序设计
1、问题描述
设计 C++类,使其能够统计文本文件中字符个数,在终端中显示结果,并将结果保存到
指定的文件中。需要统计的字符有:a、英文字母总数 b、英文单词总数从 c、中文字符总
数(包括标点符号)d、行总数 e、其他字符总数(包括英文标点、空白符等)。
2、问题分析
从问题描述中可以看到,我们所要做的就是将一篇文章( txt 格式,字符格式为 ANSI)
中出现的中英文字符出现的次数进行统计。而一篇文本文件中出现的字符种类和顺序没有
规律,如何对当前读取的字符的种类进行判断并转入到相应的统计状态成为了问题的关键。
但是,我们知道对于英文字母其 ASCII 码范围在 65~90 和 97~122 两个区间,而英文单
词的判断就是在相邻两个非英文字母之间夹着一串英文字母,所以我们可以在读取了第一
个非英文字母后判断下一个读取的是否为英文字母,如果是便转入英文字符的处理状态,
其中可同时对字母个数进行统计,在读到非英文字符时退出该状态,并将英文单词数加
1,然后转入“状态转换中心”进行状态转换的判断。
同理,对于中文字符的处理,也同上所述。但是由于中文字符占两个字节,而且各个编
码格式中中文字符的编码范围不一致,所以处理起来比较麻烦,但是原理是一致的。在本
例中仅对 ANSI 格式的编码进行处理,所以中文字符每个字节的范围为 0x80~0xff,不过
在实际操作中发现有些中文字符还是被漏掉了,应该是中文字符的编码范围并没有全部包
括进去的原因。
其他的字符处理没有什么难处,所以在此就不多述了。具体的见状态转换图吧。