- 结对对象:梁开宝 博客地址:http://www.cnblogs.com/liangkaibao/ 贡献比例 50% 50%
- 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
- 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
- 部分源程序:
-
#include <stdio.h>#include "SqList.h" // 线性表的存储与操作intpickword (FILE*f,char*fword );intmain(){FILE*f1, *f2;// 指定默认文件名,用字符串保存文件名,便于操作constintMAX_FILENAME = 20;// 文件名长度charfname1[MAX_FILENAME] ="TUT.txt";charfname2[MAX_FILENAME] ="result.txt";// 用户指定源文件名printf("请指定源文件名(不超过%d个字符):", MAX_FILENAME );scanf("%s", fname1 );// 用户指定输出文件名printf("请指定要输出结果的文件名(不超过%d个字符):", MAX_FILENAME );scanf("%s", fname2 );//打开文件if( ( f1 =fopen( fname1,"r") ) == NULL )// 异常处理{printf("打开文件%s失败!\n", fname1 );return0;}elseprintf("打开文件%s成功!\n", fname1 );SqList L;// 建立线性表SqListInit ( &L );// 初始化线性表charfword[MAX_CHARACTER];// 使用fword数组保存文件中的单词fword[MAX_CHARACTER - 1] ='\0';inti = -1;// 设置i为插入位置while( !feof( f1 ) )// 读文件未结束{intjudge = pickword ( f1, fword );// 从f指向的文件中提取单词到fword中if( -1 == judge )// 数组越界时提示并退出{printf("存在单词字符长度超过数组界限\n");return-1;}if( SqListBSearch ( &L, fword, i ) )// i返回插入位置或单词在线性表中位置{// 在线性表中找到该单词L.elem[i].count++;// 单词出现次数加1}else{// 线性表中未找到该单词SqListInsert ( &L, i, fword );// 在第i个位置上插入}}// 打开文件fname2,将内容写入if( ( f2 =fopen( fname2,"w") ) == NULL )// 异常处理{printf("写入文件%s失败!\n", fname2 );return0;}elseprintf("文件已写入%s!\n", fname2 );// 将结果写入f2指向的文件中SqListPrint ( f2, fname1, &L );// 关闭文件fclose( f1 );fclose( f2 );}intpickword (FILE*f,char*fword )// 从f指向的文件中提取单词到fword中{charch;// ch储存待检测字符for(intj = 0 , flag = 0 ; !feof( f ) ; )// 逐个对字符进行检测,flag用于标记,为0时表示单词中无字母{if( j >= MAX_CHARACTER )// 判断数组是否越界{return-1;}ch =fgetc( f );// 获取字符if( ch >='A'&& ch <='Z')// 大写字符转小写保存在fword数组中{fword[j++] = ch + 32;flag = 1;}if( ( ch >='a'&& ch <='z') )// 小写字符保存在fword数组中{fword[j++] = ch;flag = 1;}if('-'== ch && fword[j - 1] >='a'&& fword[j - 1] <='z')// 若单词中带连字符,将连字符保存在fword数组中{fword[j++] = ch;}if( ! ( ( ch >='A'&& ch <='Z') || ( ch >='a'&& ch <='z') ||'-'== ch )&& flag == 1 )// 过滤单词中的非字母字符{if( fword[j - 1] =='-')// 排除类似于 a- 的单词fword[j - 1] ='\0';fword[j] ='\0';// fword数组以'\0'结尾return0;}}} - 结果截图:
- 心得体会:学会了对文件的调用与输出
相关文章: