标志数在wordcount程序中的应用与拓展
wordcount程序要求测出文本中的单词数,字符数和行数。
设计思路:
将文件读入,逐字检测,检测到空格单词数加一,检测到回车行数单词数加一,如果既不是回车也不是空格则说明是字符,字符数加一
编程时发现的问题:
以上思路针对的是正常输入的文本,实际输入时还会出现种种特殊情况。
1.在一行结束时(换行符之前)出现空格,也就是文本后面加一个空格再按回车,这种情况会导致单词数多1。
2.文本结束时没有按下回车,会导致行数和单词数少1。
3.连续出现几个空格,也会导致单词数增多。
解决方案
设置标志数(int blank=0;),该标志数表示当前读取的文件中的字符的前一个字符是否为空格,0表示前一个字符不是空格,1表示是空格。
在读取当前字符时先查看blank的值,如果当前字符是空格时,如果blank==1,则单词数不作改动,如果blank==0,说明这个空格前之一
个单词,单词数加一,同时将blank赋值为1。如果当前字符是换行符,如果blank==1,则单词数不作改动,如果blank==0,说明换行符前
是一个单词,单词数加一。blank赋值为1。如果既不是空格也不是换行符,则说明这是一个真正的字符,字符数加一然后将blank置0。(读取
到下一个字符时,该字符的前一个是一个有意义的字符,blank!=0)。
if (c == ' ' || c == '\t')//blank
{
if (blank == )
{
count[]++;
blank = ;
}
}
else
if (c == '\n' || c == '\r')//enter
{
count[]++;
if (blank == )
count[]++;
blank = ;
}
else//char
{
count[]++;
blank = ;
}
为什么在遇到换行符时将blank置1?
在正常情况下,文本结束一行跳转下一行时,下一行的第一个字符应该是个有意义的字符,blank会被置0,如果下一行的第一个字符是空格,
blank会被赋值为1,也就是说遇到换行符将blank赋值为1这个操作是可有可无的。但是在文件结尾,这个blank的值起到了计数作用。当文件
读到结尾时,判断blank的值,如果在文件结束时,最后一个单词没有接换行符blank=0,单词数要加一。
while (c != EOF)
{ }
if (blank == )
count[]++;
fclose(fp);
如果在文件结尾单词后面有一个换行符,按照前面正常处理,blank赋值为1之后文件关闭,程序结束。
如果在程序的结尾有多个换行符(文件结尾有多个空行),因为检测到换行符blank置1,所以单词数不会增加,解决了文件特殊格式单词书出现异常的问题。
利用标志数blank进行功能拓展
可以将blank的值赋予更多的含义,如果要实现注释检测功能,当前一个字符为'/'时,用blank==2来判断,当前字符为'/'注释开始,检测到换行符注释结束。
当前字符为'*'时注释开始,用blank==3表示前一个字符为'*',当检测到blank==3当前字符为'/'时注释结束。
fgetc的返回值问题
格式:int fgetc(FILE *stream);
int c;
c = getc(fp);
while (c != EOF)
{ printf("%c", c);
c = fgetc(fp);
}
程序代码已上传至coding.net
标志数在wordcount程序中的应用与拓展的更多相关文章
- wordcount程序中的应用与拓展
设计思路: 关键是思路,首先知道 单词, 行,字符, 他们有什么特点: 1.单词,标准的是遇到空格后,单词数,自动加一. 2.行是以\n结束的, 也就是说, 遇到\n行数加一,当然也视你的操作系统而言 ...
- wordCount程序中MapReduce工作过程分析
Map处理的是一个纯文本.Mapper处理的数据是由InputFormat分解过的数据集,其中InputFormat的作用是将数据集切割成小数据集InputSplit,每一个InputSplit将由一 ...
- Hadoop学习笔记(1):WordCount程序的实现与总结
开篇语: 这几天开始学习Hadoop,花费了整整一天终于把伪分布式给搭好了,激动之情无法言表······ 搭好环境之后,按着书本的代码,实现了这个被誉为Hadoop中的HelloWorld的程序--W ...
- 021_在Eclipse Indigo中安装插件hadoop-eclipse-plugin-1.2.1.jar,直接运行wordcount程序
1.工具介绍 Eclipse Idigo.JDK1.7-32bit.hadoop1.2.1.hadoop-eclipse-plugin-1.2.1.jar(自己网上下载) 2.插件安装步骤 1)将ha ...
- 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程
本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...
- Hadoop入门实践之从WordCount程序说起
这段时间需要学习Hadoop了,以前一直听说Hadoop,但是从来没有研究过,这几天粗略看完了<Hadoop实战>这本书,对Hadoop编程有了大致的了解.接下来就是多看多写了.以Hado ...
- Hadoop下WordCount程序
一.前言 在之前我们已经在 CenOS6.5 下搭建好了 Hadoop2.x 的开发环境.既然环境已经搭建好了,那么现在我们就应该来干点正事嘛!比如来一个Hadoop世界的HelloWorld,也就是 ...
- Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式
一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...
- Mapreduce概述和WordCount程序
一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...
随机推荐
- 虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?
最近研究虚拟化技术,不可避免遇到一个问题:如何评估物理主机上虚拟主机的容量?下面这篇文章的思路有一定的启发性,转发一下. 如何确定一个CPU核上部署的虚拟机数量? 摘要:本文说明一个CPU核上部署虚拟 ...
- static成员函数
1.static成员函数不能定义为const的,这是因为static成员函数只是全局函数的一个形式上的封装,而且static成员函数不能访问类的非静态成员(没有this)指针,修改非静态数据成员又从何 ...
- 一个优秀windows C++程序员的知识体系
思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的热情. 转自http://www.cppblog.co ...
- solr python客户端 - solrpy
solrPy 基础使用: 1)与solr建立连接 import solr s = solr.Solr('http://host:ip/solr/collectionName') 2)查询 r = s. ...
- MDT部署中命令行脚本的使用。
参考:http://blogs.technet.com/b/deploymentguys/archive/2010/07/07/using-command-shell-scripts-with-mdt ...
- Linux下查看mysql、apache是否安装,安装,卸载等操作
Linux下查看mysql.apache是否安装,并卸载. 指令 ps -ef|grep mysql 得出结果 root ? :: /bin/sh /usr/ ...
- 奇怪吸引子---WimolBanlue
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- (转)c#.net常用字符串函数
Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 CompareOrdinal 与Compare一样,但不考虑文化背景 Format 格式化包含各种值的字符串和如何格式化每 ...
- O2O地图应用之判断用户订单地址是否在服务范围内
O2O地图应用之判断用户订单地址是否在服务范围内 需求分析 在o2o项目中,经常要用到在用户下单时判断用户所填地址的坐标点是否在服务范围内的情况,这里参考网上的实现方式,用C#来实现,经测试后有效,特 ...
- 使用sphinx生成Python文档
发现找不到matplotlib.sphinxext.mathmpl: 可以直接easy_install matplotlib,也可以去这里下载安装包 发现exception: matplotlib r ...