| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7863 人关注过本帖
标题:请教:怎样从文件中一个一个的读取中文字符
取消只看楼主 加入收藏
fxr2003
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-5-10
收藏
 问题点数:0 回复次数:3 
请教:怎样从文件中一个一个的读取中文字符
我想问用什么变量去存放中文字符,因为如果用fgetc()从文件中一个一个的读中文字符,不能用char变量存放,也不能用字符数组(我试了,可能是因为fgetc()不会自动将两个字节的中文字符分开存放到数组中吧).不会是用fgets(str,1,in)吧,其中str为一数组名.
搜索更多相关主题的帖子: 字符 中文 文件 
2006-05-10 23:25
fxr2003
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-5-10
收藏
得分:0 
用fgets(str,1,in)吧,其中str为一数组名.
用fgetc()好像不行
2006-05-11 09:39
fxr2003
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-5-10
收藏
得分:0 
应该用fgets(str,2,in),刚才试了....
2006-05-11 09:53
fxr2003
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-5-10
收藏
得分:0 

是的,有Knocker所说的问题,因为非中文字符还是一个字节的,所以当遇到一个字节的字符,会将其和后面的一字节连着读出来,打乱了字符的分隔.我还是贴出代码:
#include<stdio.h>
#include<string.h>
#include<conio.h>
FILE *in;
int ai;
struct rel{
int i;
char chi[20];
struct rel *next;
};
struct rel root={0,"ssss",NULL};
void change();
int look(char *);
main(){
ai=1;
change();
}
void change(){
char str[1]={0},pre[20]={0};
int a,b=0;
struct rel *p;
in=fopen("source.c","r");
while(!feof(in)){
fgets(str,2,in);
if(str[0]!=32&&str[0]!=58&&str[0]!=13&&str[0]!=10){
pre[b]=str[0];pre[b+1]=str[1];b++;}
else{
if(look(pre)==1){
p=(struct rel *)malloc(sizeof(struct rel));

p->next=root.next;root.next=p;p->i=ai;strcpy(p->chi,pre);ai++;}
for(b=0;b<20;b++) pre[b]=0; b=0;
}
}
printf("%s",root.next->next->chi);
}
int look(char *c){
struct rel *pp;
int i=1;
pp=&root;
while(pp->next!=NULL){
pp=pp->next;
if(!strcmp(pp->chi,c)) {i=0;break;}
else i=1;}
if(i==1) return 1;
if(i==0) return 0;
}
source.c中内容如下:
信息检索:索引 分词
信息组织:元数据 索引



以上程序的目的是从source.c文件中读取中文词,以空格和冒号作分词标志.如果用fgets(str,1,in),然后看str[0]是否大于0X80,以判断读得的字符是否是中文,如是,就再读后面一个字节,组成一个中文字符.但是我试的时侯,却出现了死循环.其代码如下:
while(!feof(in)){
fgets(str,1,in);
if(str[0]>0X80){
pre[b]=str[0];fgets(str,1,in);pre[b+1]=str[0];b++;}
else{
if(look(pre)==1){
p=(struct rel *)malloc(sizeof(struct rel));

p->next=root.next;root.next=p;p->i=ai;strcpy(p->chi,pre);ai++;}
for(b=0;b<20;b++) pre[b]=0; b=0;
}
}
后面发现上面死循环的代码根本就没进入到IF(if(str[0]>0X80))为真时的分支.下面这样也会死循环:
while(!feof(in)){
fgets(str,1,in);}
但是如将其改为
while(!feof(in)){
fgets(str,2,in);}就不会死循环了.请问为何?
另外fgets()函数是不是有个指针,会指向当前读取的字符呢,如果可直接对这个指针进行操作的话,也可以解决这个问题.
(感谢Knocker和feng1256,但我是新来的,在精华贴里似乎找不到有关汉字处理的帖,请各位指教,谢谢了)

[此贴子已经被作者于2006-5-11 11:33:10编辑过]

2006-05-11 11:24
快速回复:请教:怎样从文件中一个一个的读取中文字符
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024939 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved