fgetc()函数坑

本文详细解析了在C语言中使用fgetc()函数读取文本文件时常见的错误及解决办法。通过对比char和int类型变量接收字符的区别,阐述了为何使用int类型可以避免程序提前终止的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

				版权声明:本文为博主原创,转载请注明出处					https://blog.youkuaiyun.com/fireflylane/article/details/84076183				</div>
							<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
					<div class="htmledit_views" id="content_views">
            <h3><a name="t0"></a>最近从中文的文本中用 fgetc()函数读取数据时,数据读到一部分程序提早跳出。<br>

源程序中fgetc使用方法如下

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void main()
  4. {
  5. FILE *fp = fopen("1.txt", "r");
  6. if (NULL == fp)
  7. {
  8. return;
  9. }
  10. char ch;
  11. while ( ( ch= fgetc(fp) ) != EOF) //不断读取文件知道结束
  12. {
  13. putchar(ch);
  14. }
  15. system("pause");
  16. }

问题所在 fgetc 使用错误,正确使用方法  上述代码中的  ch 类型应该定义成 int 

  1. int ch;
  2. while ( ( ch= fgetc(fp) ) != EOF) //不断读取文件知道结束
  3. {
  4. putchar(ch); //打印
  5. }

分析  : fgetc 格式为  int fgetc(FILE *stream);这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF 。当读取字符时,返回值为 0x00 -- 0xff 之间。计算机系统中,数值一律用补码来表示和存储。
当ch 类型为char 时(错误使用方式)
1.fgetc读到字符0xFF时转换成32位为0x000000FF返回 ,代码中用 char类型的ch接收,0x000000FF被截断,ch等于0xFF。  
2.EOF值为-1,即0xFFFFFFFF,与值为 0xFF(即 char 类型-1的表示方式)的ch比较时,ch转换成32位后为0xFFFFFFFF(32系统中int 类型 -1的表示方式),比较结果为相等,导致判断失误,程序提早退出。
当ch 为 int 类型 (正确使用方式)
读到 字符 0xFF函数返回为0x000000FF,读到末尾返回EOF即0xFFFFFFFF,不会导致判断出错。
总结 出错原因在于:变量ch 为char类型读到字符0xFF与EOF(-1)比较时相等,误判为已经读到文件末尾。
--------------------- 
原文:https://blog.youkuaiyun.com/little_bobo/article/details/55189472 
 

 

博主在写哈夫曼编码项目的时候就踩过这个坑:

原文件是:

AABBBCCCCCDDDDDDDEEEEEEEEEEEFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

解压后:

AABBBCCCCCDDDDDDDEEEEEEEEEEEFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK

 

把编码文件code.txt拖到winhex中查看发现后面有一堆FF

原因找到了,当初博主写代码是不是很理解老师给的这段代码中的totalCount的作用,把它注释掉了,用fgetc() == EOF来判断文件的结束,刚好撞枪口上了,解压出来当然少了那么一截

后来把totalCount用上问题迎刃而解

### C语言 `fgetc` 函数使用方法 #### 函数原型 在C语言中,`fgetc()` 函数用于从输入流中获取下一个字符并使文件指针前进一位。该函数的声明如下[^1]: ```c int fgetc(FILE* filename); ``` 此函数接受一个指向 `FILE` 类型的指针作为参数,并返回一个整数类型的值表示所读取到的字符。 #### 返回值说明 当成功读取字符时,`fgetc()` 将其转换成无符号字符形式再转为整数值返回;如果到达文件末尾或发生错误,则会返回EOF(通常定义为-1)。因此,在实际编程过程中应当注意区分正常结束与异常情况[^2]. #### 实际应用案例 下面给出一段简单的程序来展示如何利用 `fgetc()` 来逐字节地复制源文件至目标文件: ```c #include <stdio.h> void copyFile(const char *sourcePath, const char *destinationPath){ FILE *src = fopen(sourcePath, "r"); if (!src) { perror("Failed to open source file."); return; } FILE *dest = fopen(destinationPath, "w+"); if (!dest) { fclose(src); perror("Failed to create destination file."); return; } int ch; while ((ch = fgetc(src)) != EOF){ // 使用fgetc读取单个字符直到遇到文件结尾 fputc(ch, dest); // 把读出来的字符写入新的文件里 } fclose(dest); fclose(src); } int main(){ copyFile("input.txt","output.txt"); } ``` 上述代码实现了通过调用 `fgetc()` 方法依次读取原文件中的每一个字符,并将其保存到另一个新创建的目标文件当中去[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值