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

一个中文字符是两字节,那你读取时一次读取个偶数字节放在一个数组里
按%s输出就可以


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-10 23:41
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
得分:0 

这样啊!谢谢啦

敢犯强汉者,虽远必诛!——陈汤 不知吾辈何时方能吐出此豪言壮语?
2006-05-11 00:04
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
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
这个问题不是那么简单的,

[QUOTE]这个f问d题不3是那f么简gg单dd的,[/QUOTE]
假如是这样,你的fgets(str,2,in)能行么?

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-05-11 10:01
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
对于汉字的处理以前的贴子有过讨论,自己找找吧。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-05-11 10:03
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
onzixuanly
Rank: 1
等 级:新手上路
帖 子:12
专家分:9
注 册:2010-4-9
收藏
得分:0 
回复 5楼 fxr2003
我们需要做一个此法分析器,有使用到对文件的读写,刚刚试了一下,fgets(str,1,fp)不可以,而fgets(str,2,fp)可以,但是不明白这这是为什么?
哪位高手给说一下吧……谢谢啦

[ 本帖最后由 onzixuanly 于 2010-4-11 18:34 编辑 ]
2010-04-09 14:06
lucifly
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-2-23
收藏
得分:0 
回复 9楼 onzixuanly
为什么我的电脑是fgets(str,3,fp),才可以,,,,跟编译器有关?我用的dev
2013-02-23 17:19
快速回复:请教:怎样从文件中一个一个的读取中文字符
数据加载中...
 
   



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

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