关于fgetc

今天试了几个文件操作的函数,我发现在调用fgetc()获取字符的时候,如果文件内容是英文,则可以正常显示,如果内容是中文,如果只调用一次fgetc(),将获得的字符打印出来是问号,如果在循环里连续读取并打印,则能显示正确的汉字。

我个人感觉fgetc()每次只读取一个char,如果是汉字的话,将会被拆成两半读取,所以显示的是问号,但是我不明白为什么连续读取的时候就能正确显示了呢?希望了解的朋友能给讲解一下,谢谢!


因为中文在Windows默认字符编码下是多字节编码,一般是两个字节对应一个汉字,而fgetc只能读取一个字节,而只打印这一个字节的话,就是系统无法识别的乱码。只有相应的几个字节都打印出来,操作系统才能解码出正确的汉字并显示出来。

《脑动力:C语言函数速查效率手册》第5章输入/输出函数(二),本章与前一章同属于一个大的分类:输入/输出函数。为了与之前的函数区分开,故此把所有与文件相关的函数单列一章,以便读者查询方便。本节为大家介绍从流中读取一个字符fgetc()。

AD:2013云计算架构师峰会超低价抢票中

5.1.23  从流中读取一个字符fgetc()

【函数原型】int fgetc(FILE* stream)

【功能讲解】从流中读取一个字符,返回值为读到的字符,遇到文件结尾返回EOF。

【参数说明】stream为文件流指针。

【程序示例】打开一个文本文件,然后使用fgetc函数获取其内容并显示出来。

   
   
  1. /*函数fgetc()例子*/  
  2. #include <stdio.h>   
  3. #include<stdlib.h> 
  4. #include<io.h> 
  5. #include<conio.h> 
  6. int main(void)   
  7. {   
  8.     /*本例子需要手工创建一个文件test.txt或者与函数fputc()一起调试*/  
  9.     char msg[] = "This is a test!\n";   
  10.     char msgget[100];  
  11.     int i = 0;   
  12.     FILE* fstream;  
  13.     fstream=fopen("test.txt","r");      /*打开*/  
  14.     if(fstream==NULL)  
  15.     {  
  16.         printf("Open file failed!\n");  
  17.         exit(1);  
  18.     }  
  19.     i = 0;  
  20.     while ((msgget[i]=fgetc(fstream))!=EOF)   
  21.     {   
  22.         fputc((msgget[i]), stdout);   
  23.         i++;   
  24.     }   
  25.     fclose(fstream);  
  26.     return 0;   
  27. }  

【运行结果】
   
   
  1. This is a test! 

【实例讲解】程序首先是打开文件test.txt(本例在调试时是使用函数fputc()示例生成的文本文件),如果成功打开,则使用while循环调用fgetc()逐个读取文件中的字符。
【责任编辑: book TEL:(010)68476606】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值