最近从中文的文本中用 fgetc()函数读取数据时,数据读到一部分程序提早跳出。
源程序中fgetc使用方法如下

#include<stdio.h>
#include<stdlib.h>void main()
{FILE *fp = fopen("1.txt", "r");if (NULL == fp){return;}char ch;while ( ( ch= fgetc(fp) ) != EOF)  //不断读取文件知道结束{putchar(ch);}system("pause");}

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

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

分析  : 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.csdn.net/little_bobo/article/details/55189472

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

原文件是:

AABBBCCCCCDDDDDDDEEEEEEEEEEEFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

解压后:

AABBBCCCCCDDDDDDDEEEEEEEEEEEFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK

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

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

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

fgetc函数踩过的坑相关推荐

  1. php explode txt,使用PHP的explode函数踩过的坑

    一.概述 前段时间,在项目中使用了explode,没想到既然踩坑了,只好记录下这个坑.我们先来看一个例子吧,如下:$str1 = "zhangsan,wangwu,zhaoliu" ...

  2. C/C++ 踩过的坑和防御式编程

    相信你或多或少地用过或者了解过 C/C++,尽管今天越来越少地人直接使用它,但今天软件世界大多数软件都构筑于它,包括编译器和操作系统.因此掌握一些 C/C++ 技能的重要性不言而喻. 这场 Chat ...

  3. ubuntu下vscode调试开发踩过的坑

    最近刚过安装了中文版的ubuntu18.04.1,安装完之后想在ubuntu上安装vscode做c/c++的开发调试,踩了不少坑,在此记录一下,希望大家在这条路上不要再踩同样的坑. 1.安装vscod ...

  4. python360百科_python抓取360百科踩过的坑!

    学习python一周,学着写了一个爬虫,用来抓取360百科的词条,在这个过程中.因为一个小小的修改,程序出现一些问题,又花了几天时间研究,问了各路高手,都没解决,终于还是自己攻克了,事实上就是对lis ...

  5. golang中创建logger时候踩过的坑

    golang中创建logger时候踩过的坑 错误的代码 package mainimport ("fmt""io""log""os ...

  6. 记录一下 开发STM32 USB HID踩过的坑

    记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...

  7. 从vue文件中抽取出子组件的流程及过程中踩过的坑

    流程: 1. 确保注册.引入子组件的正确性: 创建一个新的vue文件,包含基本的template,及export的内容,其中可简单包含空的data函数.暂时先不把子组件中的代码移出.在父组件中impo ...

  8. 机器学习中踩过的坑,如何让你变得更专业?

    2020-05-24 23:42:23 编译 | 这只萌萌 编辑 | 丛 末 踩过坑才知道哪些路不可行,有时候犯错误也能帮助我们变得更加专业. 数据科学家Archy de Berker 在本文中详述了 ...

  9. 第二篇:C/C++语法踩过的坑

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.C++内置库支持[库->API] 1.内置库和API函数的 ...

最新文章

  1. 概率统计概念复习:MAPMLE
  2. hdfs yarn hbase pid文件被删除解决办法:修改hadoop-daemon.sh yarn-daemon.sh hbase-daemon.sh中PID_DIR存储路径
  3. python 3 递归调用与二分法
  4. php怎么实现商品评论功能,php购物车功能如何实现
  5. 计算机操作系统读者和写者模型的简单介绍以及思考
  6. 单例设计模式-懒汉式(线程安全)
  7. JDK源码解析之Java.util.Collections
  8. 最详细的YOLOv2论文笔记
  9. web集群之 Keepalived
  10. java基础之输入语句
  11. log函数 oracle power_Oracle 函数大全详细介绍
  12. 轻松取消Excel中的“自动添加超链接”
  13. 基于CNN的人脸相似度检测
  14. 单选题计算机科学的奠基人是,超星尔雅计算机课程(2017年)
  15. 排序专题——8.基数排序之LSD法
  16. ACTS:首屈一指的软件测试策略是什么?
  17. 微信分享功能踩坑过程
  18. blocked Queue
  19. python中unicode函数的包_Python unicodeutil包_程序模块 - PyPI - Python中文网
  20. 菜鸟炒美股(一) (转)

热门文章

  1. 男生哪个瞬间让你心疼?
  2. 军犬舆情热点:千亿矿权案成立联合调查组;格力人均加薪1000元
  3. html5 游戏制作教程,利用HTML5 Canvas制作一个简单的打飞机游戏
  4. java获取下周一_java 获取下周一日期
  5. 加菲猫经典语录(二十二条,中英文对照)
  6. 图深度学习——复杂图嵌入:异质图,二分图,多维图,超图,符号图,动态图
  7. 巴拿赫空间上的复变函数
  8. 情人节快乐 2008 追赶情人的情人节
  9. docker制作tomcat镜像并部署war包
  10. 【华人学者风采】李海洲 新加坡国立大学