今天试了几个文件操作的函数,我发现在调用fgetc()获取字符的时候,如果文件内容是英文,则可以正常显示,如果内容是中文,如果只调用一次fgetc(),将获得的字符打印出来是问号,如果在循环里连续读取并打印,则能显示正确的汉字。
我个人感觉fgetc()每次只读取一个char,如果是汉字的话,将会被拆成两半读取,所以显示的是问号,但是我不明白为什么连续读取的时候就能正确显示了呢?希望了解的朋友能给讲解一下,谢谢!
因为中文在Windows默认字符编码下是多字节编码,一般是两个字节对应一个汉字,而fgetc只能读取一个字节,而只打印这一个字节的话,就是系统无法识别的乱码。只有相应的几个字节都打印出来,操作系统才能解码出正确的汉字并显示出来。
《脑动力:C语言函数速查效率手册》第5章输入/输出函数(二),本章与前一章同属于一个大的分类:输入/输出函数。为了与之前的函数区分开,故此把所有与文件相关的函数单列一章,以便读者查询方便。本节为大家介绍从流中读取一个字符fgetc()。
5.1.23 从流中读取一个字符fgetc()
【函数原型】int fgetc(FILE* stream)
【功能讲解】从流中读取一个字符,返回值为读到的字符,遇到文件结尾返回EOF。
【参数说明】stream为文件流指针。
【程序示例】打开一个文本文件,然后使用fgetc函数获取其内容并显示出来。
- /*函数fgetc()例子*/
- #include <stdio.h>
- #include<stdlib.h>
- #include<io.h>
- #include<conio.h>
- int main(void)
- {
- /*本例子需要手工创建一个文件test.txt或者与函数fputc()一起调试*/
- char msg[] = "This is a test!\n";
- char msgget[100];
- int i = 0;
- FILE* fstream;
- fstream=fopen("test.txt","r"); /*打开*/
- if(fstream==NULL)
- {
- printf("Open file failed!\n");
- exit(1);
- }
- i = 0;
- while ((msgget[i]=fgetc(fstream))!=EOF)
- {
- fputc((msgget[i]), stdout);
- i++;
- }
- fclose(fstream);
- return 0;
- }
【运行结果】
- This is a test!
【实例讲解】程序首先是打开文件test.txt(本例在调试时是使用函数fputc()示例生成的文本文件),如果成功打开,则使用while循环调用fgetc()逐个读取文件中的字符。
【责任编辑:
book TEL:(010)68476606】