V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

请问 c++中文件读写,有没有什么办法无视文本编码方式,强行按照 8bit 一字符读取?

  •  
  •   Newyorkcity · 2018-12-03 21:35:29 +08:00 · 1150 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。
    情景是这样的
    一个霍夫曼编码树的作业,所谓霍夫曼编码就是按照一定方式将文本中的字符用 0 和 1 重新编码,其中出现较多的字符所用的位数少.比如说字母 e 在这个文本中大量出现,可能给它规定的编码就是 01,而字母 s 较少出现,可能给它的编码就是 011110.
    因为我没法直接对文件读写 bit(如果有办法或者有成熟的库还劳烦推荐),所以只有先将文件的内容全部转换为 0 或 1 的 字符存储在一个 string 里,然后对这个 string 每 8 个字符一截,因为这 8 个字符都是 01 组成的,把这一段当作二进制数处理,就能得到一个 0-255 间的数,然后把这个数强制类型转换为 char 然后输出到一个文件里去..
    然后问题来了,现在我要从这个文件里读我输出的内容(显然直接去看这个内容的话会是一堆乱码)...
    我的想法是乱不乱码没关系,反正我读进来放到一个 string 里,然后每个字符对应一个 0-255 的数,我再把这个数转回那个二进制字符串,然后拼起来,这样我就又得到霍夫曼编码了...结果发现这一步已经回不去了...
    我个人的想法是可能我在读入的时候,c++一脸懵逼不知道它要按照什么编码方式,在读入啥 j8 玩意儿,所以读回来的东西猜不对..如果能告诉 c++你就按照 8bit 一字符读,具体读进来的内容到底是什么用不着你管,我觉着能解决这个问题吧?
    谢谢
    7 条回复    2018-12-04 02:03:16 +08:00
    ysc3839
        1
    ysc3839  
       2018-12-03 21:44:36 +08:00 via Android
    贴出代码看看吧。
    shirokow
        2
    shirokow  
       2018-12-03 21:46:54 +08:00 via Android   ❤️ 1
    ifstream ifs(ifsteam::binary) 试试?
    zn
        3
    zn  
       2018-12-03 21:53:09 +08:00
    mmap 了解一下。
    choury
        4
    choury  
       2018-12-03 21:57:32 +08:00 via Android
    这和 c++没关系,读内存字节是最小的单位了,你自己封装一个读写函数就行了
    wevsty
        5
    wevsty  
       2018-12-03 21:57:54 +08:00   ❤️ 1
    按照二进制位来操作,std::bitset 了解一下。
    file open 的时候传入标志位按照二进制方式做 read 出来就是原始的字节了。

    std::fstream 系列的类的话传入 ios::binary 就行
    whileFalse
        6
    whileFalse  
       2018-12-03 21:57:55 +08:00
    msg7086
        7
    msg7086  
       2018-12-04 02:03:16 +08:00
    你这是要把 C++用出 Python 2 的感觉吗。C 系读 bits 直接读不就是了,反正都是一堆内存字节。C 本身连编码都没有,你想让他编码都不行(得找 iconv 外援什么的)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3285 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:11 · PVG 20:11 · LAX 05:11 · JFK 08:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.