c语言中读取及输出汉字的问题

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*stream;charch[3];chartemp;if((stre... #include <stdio.h>
#include <stdlib.h>

void main()
{
FILE *stream;
char ch[3];
char temp;

if((stream=fopen("d:\\new1.txt", "rt"))==NULL)
{
perror("cannot open the file!\n");
exit(1);
}
/* while(feof(stream)==0)
{
/*fread(ch, sizeof(ch), 1, stream);
printf("%s\n", ch);
printf("%c%c\n", ch[0], ch[1]);*/

/*fgets(ch, 1, stream);
printf("%s\n", ch);*/

/*fread(&temp, sizeof(temp), 1, stream);
putchar(temp);*/

/*fscanf(stream, "%c", &temp);
printf("%c", temp);*/

//}
fgets(ch, 3, stream);
printf("%s\n", ch);///这种写法有问题对ch数组有什么要求?
fclose(stream);
}
/*
d:\\new1.txt 里面是2个汉字,随便写的,请问为什么前2种写法,不能正确显示出来
汉字,但是后2中写法却可以?问题出在那里?还有没有别的写法了?

不好意思,我最多只能悬赏100分,但是如果回答的好,我可以加分
*/
zhusisi007你的2中方法都不可行,
1. 不可能定义一个比文本长度还长的数组
2. fread(ch, sizeof(ch), 1, stream);
printf("%s\n", ch); //或者用printf("%c%c\n",ch[0],ch[1]);单个输出
你改成printf("%s", ch) 把\n去掉才可以。

其实你可以很随意的输出半个汉字。。
void main()
{
char ch;
FILE *stream;

if((stream=fopen("d:\\new1.txt", "r"))==NULL)
{
perror("couldnot open the file!\n");
exit(1);
}

while(feof(stream)==0)
{
ch=fgetc(stream);
printf("%c", ch);
}
}
展开
 我来答
specter丶
2009-04-23
知道答主
回答量:2
采纳率:0%
帮助的人:0
展开全部
为了方便文本文件的操作,标准函数编程库提供了,行读写函数,
char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);
-----------------------精通unix下c语言编程与项目实践P66
行输出函数族
int puts(const char *s);
int fputs(const char *s, FILE *stream);
-----------------------精通unix下c语言编程与项目实践P67
块读写函数
能够输入输出任意数量的字符,在操作二进制文件时常常使用,
fread 和fwrite
块读写函数经常操作二进制文件。
-----------------------精通unix下c语言编程与项目实践P70

再有就是编码的知识了
当你输出的ascii码在汉字的范围内的时候,汉字系统会认识到
然后把相应的ascii码变成汉字。
首听枫都用
2019-09-29 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:35%
帮助的人:617万
展开全部
-_-~
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了
这个是基础问题了,一个汉字要两个字节表示
如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排
char
ch[3]足够了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
warmwormn
2009-04-21 · TA获得超过737个赞
知道小有建树答主
回答量:1694
采纳率:0%
帮助的人:1330万
展开全部
-_-~
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了

这个是基础问题了,一个汉字要两个字节表示

如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排 char ch[3]足够了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhusisi007
2009-04-13
知道答主
回答量:12
采纳率:0%
帮助的人:7.5万
展开全部
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *stream;
int i;
char c,ch[10];
/*关键处在此:无论是fread还是fgets都可以,只要把数组定义得超过文件中数据长度即可。这样才不会出现乱码也不会因为溢出而损坏内存中的其它数据。*/
stream=fopen("d:\\new1.txt", "r");
/*你说两种都不能用可能是开始我的文件位置和你的不一样,我已经改过来了。
不过第一种方法我试了一下确实有乱码,现在把程序重新改了一下,确认没有任何错误了。
我用的是Visual C++ 6.0的编译器。*/

for(i=0;i<10;i++)
{
fread(&c, sizeof(c), 1, stream);
if(c!='\n' && feof(stream)==0)
ch[i]=c;
else
{ch[i]='\0';break;}
}
printf("%s\n", ch); //或者用printf("%c%c\n",ch[0],ch[1]);单个输出

/*
fgets(ch, sizeof(ch), stream);
printf("%s\n", ch); //或者用printf("%c%c\n",ch[0],ch[1]);单个输出
*/
fclose(stream);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jaycnvip
2009-04-10 · TA获得超过767个赞
知道小有建树答主
回答量:998
采纳率:100%
帮助的人:636万
展开全部
首先要注意:2个汉字至少需要 4 个字节来存储

fread的语法没有错,但是建议用二进制方式打开文件读入数据,可避免乱码

fgets有一点要注意,第二个形参 int t 即读入数据的长度,但是实际上只读入t-1 的长度,最后一位系统留出来填充'\0'
两个汉字至少需要 4 个字节,因此用fgets读入时,t >=5,即
ch[5];
fgets(ch,5,stream);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(8)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式