前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >fgetc函数踩过的坑

fgetc函数踩过的坑

作者头像
用户7886150
修改2021-02-14 15:28:53
修改2021-02-14 15:28:53
5760
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ fgetc()

最近从中文的文本中用 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用上问题迎刃而解

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档