c 语言如何在文件中提取单词,并按照英文词典顺序排序输出到另外一个文件(100分)

xinkekang 2009-05-13 12:15:03
例:文件中A中有
abc#aba?axy34 hpz_hh
aaa+=ccc
经过取词排序在文件B中排列如下:
aaa
aba
abc
axy
ccc
hpz_hh
我自己写了把文件A中的内容取出存储到文件B中这一部分,但是取词排序不知道怎么写,各位高手大大帮帮忙补充下,非常感谢哈
我的代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
char inputfilename[] = "H:\\wordwork1\\study\\input.txt";
char outputfilename[] = "H:\\wordwork1\\study\\output.txt";

FILE *fp;
FILE *fp1;
char ch,c[1024];
int i,j;

if((fp=fopen(inputfilename,"r"))==NULL)
{
printf("input file cannot be opened\n");
exit(0);
}
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
c[i] = ch;
putchar(c[i]);
}
fclose(fp);

j=i;
if((fp1=fopen(outputfilename,"w"))==NULL)
{
printf("output file cannot be opened\n");
exit(0);
}
for(i=0;i<j;i++)
{
fputc(c[i],fp1);
putchar(c[i]);
}
fclose(fp1);

return 0;
}
...全文
1108 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykwfly 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liao05050075 的回复:]
取词的话,你可以使用strtok()函数,特别方便
[/Quote]

strtok()确实不错 建议使用!!
lpf000 2009-05-13
  • 打赏
  • 举报
回复
先申请一个2维数组。遍历存储文件的数组,将数组赋值给2维数组。判断方法,遇到不是字母的字符,就换下一行。。
,然后将2维数组排序,写入文件。。。
  • 打赏
  • 举报
回复

int i,j,k;
char s[2000][40]; //认为一个单词不超过40个字符
char cmp[40];
...取词
for(i=1;i<2000;i++) //在内存排序
for(j=1;j<2000-i;j++)
{
if( (strcmp(s[j],s[j-1]<0 ))
{
strcpy(cmp,s[j]);
strcpy(s[j],s[j-1]);
strcpy(s[j-1],cmp);
}
}




写了大慨的,你用用看下。
liao05050075 2009-05-13
  • 打赏
  • 举报
回复
取词的话,你可以使用strtok()函数,特别方便
  • 打赏
  • 举报
回复
虽然不能用容器,strcmp还是可以用的撒,排序算法更容易啦,不是很快就出来了么。
  • 打赏
  • 举报
回复
以前写过一个很烂的。
直接在内存里排序,排序完写入文件。
Proteas 2009-05-13
  • 打赏
  • 举报
回复
标准模板库。
liliangbao 2009-05-13
  • 打赏
  • 举报
回复
帮顶~
xianyuxiaoqiang 2009-05-13
  • 打赏
  • 举报
回复
上述数据结构使用方法:

每次读入一个单词,根据前两个字母确定二级索引的位置。比如:

wordlist ws;//词库
word curword;//当前词语
char[] str="abcd";
curword.chars = str;//获取词语信息,这里只是示意,实际需要从文件读取
curword.next = NULL;
unsigned int indexone = curword.chars[0] - 'a';//一级索引
unsigned int indextwo = curword.chars[1] - 'a' + 1;//二级索引,注意如果只有一个字母要特殊处理为0
indextwo *curindex =&( ws.indexone[indexone].indextwo[indextwo] );//获取二级索引位置。
//下面就可以在二级索引下的词语链表里搜索"abcd"适当的位置了。也就是简单的单链表查询和插入操作。
xiaoliang_c 2009-05-13
  • 打赏
  • 举报
回复
up
xianyuxiaoqiang 2009-05-13
  • 打赏
  • 举报
回复
以下数据结构供楼主参考:
struct word{
char *chars;//单词
word *next;//下个单词
};
struct wordlist{
indexone[26];//一级索引
};
struct indexone{
indextwo[27];//二级索引
};
struct indextwo{//二级索引下的单词链
word *head;//第一个单词
word *tail;//第二个单词
};

注:引入二级索引结构以提高搜索效率约500倍。
一级索引数组下标为当前单词的第一个字母-'a'。
二级索引数组下标为当前单词的第二个字母-'a'+1,如果是单字母单词,下标为0。
fangjun_2008 2009-05-13
  • 打赏
  • 举报
回复
就给个算法吧,
第一步:统计文件中单词数目,
第二步:用一个整型的标记数组a【100】,数组元素中的值表示单词或其他连续字符占得空间大小,比如"aa,,bb,vvv,"那么就a[0]=2,a[1]=2,a[2]=1,a[3]=3,a[4]=1;奇数或偶数表示全是单词
第三步:由第二步的信息,可以每个单词后字符替换成空字符,
第4步:第2步信息,可以创建一个指针数组,由第1步的信息可判定数组大小,由第二步信息,可以使用文件的移位,定位等操作,使指针数组里的元素指向文件里的字符串
第5步,排序,由第4步的信息,对指针数组排序即可,也很容易了
第6步:根据第5步,把相应的字符串写入文件中,可以每写一次,加个空格,这样就容易看清
这个算法没有直接对文件操作的,没有耗太大内存,总的说应该算是不错了,操作起来也不是很难。
yet_flash 2009-05-13
  • 打赏
  • 举报
回复
使用stl
javacrazy007 2009-05-13
  • 打赏
  • 举报
回复
学习啊

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧