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);
}
} 展开
#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);
}
} 展开
10个回答
展开全部
为了方便文本文件的操作,标准函数编程库提供了,行读写函数,
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码变成汉字。
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码变成汉字。
展开全部
-_-~
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了
这个是基础问题了,一个汉字要两个字节表示
如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排
char
ch[3]足够了
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了
这个是基础问题了,一个汉字要两个字节表示
如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排
char
ch[3]足够了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
-_-~
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了
这个是基础问题了,一个汉字要两个字节表示
如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排 char ch[3]足够了
仔细看一下几个函数的区别,
有的支持越界写数据(不指定读取长度<-一般会在数组中自动追加\0x00结束符),
有的不支持越界写数据(指定读取长度<-可能不会在数组中自动追加\0x00结束符,要用户手工填写字符串的0x00结束)
原因就在这里了
这个是基础问题了,一个汉字要两个字节表示
如果使用GB18030编码的话,可以认为,当一个字节>=128时,则这个字节是汉字的第一个字节,要再读取一个字节,拼接成一个汉字来处理
所以处理中英文混排 char ch[3]足够了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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);
}
#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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先要注意:2个汉字至少需要 4 个字节来存储
fread的语法没有错,但是建议用二进制方式打开文件读入数据,可避免乱码
fgets有一点要注意,第二个形参 int t 即读入数据的长度,但是实际上只读入t-1 的长度,最后一位系统留出来填充'\0'
两个汉字至少需要 4 个字节,因此用fgets读入时,t >=5,即
ch[5];
fgets(ch,5,stream);
fread的语法没有错,但是建议用二进制方式打开文件读入数据,可避免乱码
fgets有一点要注意,第二个形参 int t 即读入数据的长度,但是实际上只读入t-1 的长度,最后一位系统留出来填充'\0'
两个汉字至少需要 4 个字节,因此用fgets读入时,t >=5,即
ch[5];
fgets(ch,5,stream);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询