zoukankan      html  css  js  c++  java
  • 文件读写关于字符的错误&解决方案

    最近打哈夫曼编码,压位以后需要支持任意数据的字节流文件读写,然后一堆玄学bug调了我一天。。

    好在终于可以把bug汇总了:

      1.0x1A问题:用字符文件读入时,读到0x1A会提前中断,返回-1(unsigned char为255)。实际上这是Windows系统一个远古bug,因为曾经0x1A就是EOF,然而现在EOF已经变为-1了。

      解决方案:使用rb二进制文件读入,可以防止读入函数进行加工转义。

      2.判断文件结束问题:EOF为255,然而对于字符0xFF(255),EOF将会和0xFF重复。然而实际上EOF返回的是一个int类型整数-1,即0xFFFFFFFF,而被unsigned char截断以后,就只剩下了0xFF,无法和字符0xFF区分。

      解决方案:使用unsigned short类型读入。

      3./r字符自动补全:Windows系统下会自动将/n字符补全为/r/n,所以要判断当前读到的这个/r究竟是自动补全的还是本来就是数据里面的。

      解决方案:对于本来就是/n转换成/r/n的,直接跳过/r

           对于本来就是/r后面接了一个/n的,将会变成/r/r/n,要去掉其中的一个/r

           对于本来就是/r的,读入判断确实只有/r以后,复位按照这一次就是/r的情况进行操作(fseek把文件位置指针转移回来一个)

      最终实现的win下fgetc二进制文件的函数:

    bool fgetc_windows(FILE *in, unsigned char &ret) {
    	unsigned short ch_buf; 
    	if((ch_buf = fgetc(in)) == 0xffff) return false; 
    	if(ch_buf == 13 && (ch_buf = fgetc(in)) != 10) {
    		fseek(in, -1, 1); 
    		ch_buf = 13; 
    	}
    	ret = (unsigned char) ch_buf; 
    	return true; 
    }
    
  • 相关阅读:
    2018-2019-2 实验三 敏捷开发与XP实践
    计算机网络课外实验一级 20175319江野
    2018-2019-2 《Java程序设计》第9周学习总结
    MyCP(课下作业,必做)
    [NOIP2012] 疫情控制
    [SPOJ2021] Moving Pebbles
    谁能赢呢?
    [HEOI2014] 人人尽说江南好
    [笔记] 巴什博弈
    [SCOI2008] 着色方案
  • 原文地址:https://www.cnblogs.com/euphoria-eden/p/11785046.html
Copyright © 2011-2022 走看看