wordcount程序中的应用与拓展

设计思路:

      关键是思路,首先知道 单词, 行,字符, 他们有什么特点: 1、单词,标准的是遇到空格后,单词数,自动加一。 2、行是以\n结束的, 也就是说, 遇到\n行数加一,当然也视你的操作系统而言。3、字符, 空格是否记在里面? 等因素需要考虑。所以这就要求我们将文件读入,逐字检测,检测到空格单词数加一,检测到回车行数单词数加一,如果既不是回车也不是空格则说明是字符,字符数加一 编程时发现的问题: 以上思路针对的是正常输入的文本,实际输入时还会出现种种特殊情况。 1.在一行结束时(换行符之前)出现空格,也就是文本后面加一个空格再按回车,这种情况会导致单词数多1。 2.文本结束时没有按下回车,会导致行数和单词数少1。 3.连续出现几个空格,也会导致单词数增多。

      在本次试验中我在查资料是发现,因为不同的平台对文本文件换行的处理不一样,Linux以'\n'为换行符,Windows以'\n\r'为换行符,Mac又以'\r\n'为换行符。所以,使用getc()函数处理换行时比较麻烦,于是我便学习网上”大牛“们,建立缓冲区,fgets()函数用于从文件中读取一行或指定个数的字符,其原型为:char * fgets(char *buffer, int size, FILE * stream);

      所以在每一行便进行一次结果统计,最后,将结果统计相加。buffer为缓冲区,用来保存读取到的数据。size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。读取的字符包括换行符。stream为文件指针。

     首先是打开文件fopen(打开文件)相关函数open,fclose表头文件#include<stdio.h>定义函数FILE * fopen(const char * path,const char * mode);参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件

    if( (fp=fopen(filename, "rb")) == NULL ){
        perror(filename);
        return NULL;
    }

 

对于perror函数名  功  能: 系统错误信息  用  法: void perror(char *string);
程序例:

#include <stdio.h>

int main(void)
{
   FILE *fp;

   fp = fopen("perror.dat", "r");
   if (!fp)
      perror("Unable to open file for reading");
   return 0;
}

       在每一行便进行一次结果统计,最后,将结果统计相加。buffer为缓冲区,用来保存读取到的数据。size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'

    for(i=0; i<len; i++){
            c = buffer[i];
            if( c==' ' || c=='\t'){ 
                !blank && wNum++; 
                blank = 1;
            }else if(c!='\n'&&c!='\r'){  
                cNum++;
                blank = 0;
            }
        }

 

对于不是空格单词数+1

        !blank && wNum++;  
  EOF只是为了标识已经读到文件末尾,它并不是一个存储在文件中的字节。所以在判断文件是否读完时不能直接判断(fgetc()==EOF)
而是要赋值之后再进行判断
int c;
c = getc(fp);
    while (c != EOF)
    {
        
        printf("%c", c);
        c = fgetc(fp);
    }

 

 

最后输出
程序代码已上传至coding.net

 

posted @ 2016-03-23 16:20  郭光耀  阅读(320)  评论(0编辑  收藏  举报