V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
emtry
V2EX  ›  C

fstream 怎么输出二进制文件

  •  
  •   emtry · 2018-02-23 20:19:10 +08:00 · 2552 次点击
    这是一个创建于 2494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    string temptarget = “ 01110110001100100110010101111000 “;
    void Target()
    {
    	ofstream fout;
    	fout.open("Target.txt", ios::out | ios::binary);
    	fout.write(temptarget.data(), temptarget.size());
    
    	fout.close();
    }
    

    打开 Target.txt 后仍是 01110110001100100110010101111000, 要怎么才可以在文本编辑器显示 v2ex

    15 条回复    2018-02-23 23:01:06 +08:00
    wevsty
        1
    wevsty  
       2018-02-23 20:56:08 +08:00
    附加了 ios::binary 标志位就是按照二进制方式写入的。

    string temptarget = “ 01110110001100100110010101111000 “;
    这个样写并不是把 01110110001100100110010101111000 当作二进制存入 string 的意思。
    emtry
        2
    emtry  
    OP
       2018-02-23 21:11:23 +08:00
    @wevsty 那怎么把 01110110001100100110010101111000 当作二进制存入 string
    aheadlead
        3
    aheadlead  
       2018-02-23 21:12:35 +08:00
    string temptarget = "v2ex";
    emtry
        4
    emtry  
    OP
       2018-02-23 21:18:09 +08:00
    @aheadlead 已知只有 01110110001100100110010101111000
    aheadlead
        5
    aheadlead  
       2018-02-23 21:23:12 +08:00
    @emtry https://stackoverflow.com/questions/537303/binary-literals

    如果你的 cpp 编译器够新的话 可以用 binary literal
    此外你还要注意字节序…
    zeanzhou
        6
    zeanzhou  
       2018-02-23 21:27:12 +08:00
    每 8 个 bit 转成一个 char,输出 char
    acros
        7
    acros  
       2018-02-23 21:33:03 +08:00
    这个必须自己手动转化吧?
    而且你以 string 形式得到的 01 序列,编码格式和 little/big Endian 都要自己考虑·····
    acros
        8
    acros  
       2018-02-23 21:35:37 +08:00
    这个数据源有点奇怪,数据是 char/byte 数组还差不多,怎么会是 string 类型的····
    要在 01110110001100100110010101111000 输出后看到 v2ex,那你也该以文本形式写入。 似乎题目描述有点矛盾。
    aheadlead
        9
    aheadlead  
       2018-02-23 21:42:08 +08:00
    @acros 其实感觉楼主应该是初学 cpp
    折腾折腾也是不错的
    snnn
        10
    snnn  
       2018-02-23 22:02:26 +08:00 via Android
    自己写个简单的 for 循环就可以把二进制字符串转 char 数组。然后 fopen、fwrite、fclose 了事
    emtry
        11
    emtry  
    OP
       2018-02-23 22:07:16 +08:00
    @acros
    @aheadlead
    大学狗写哈夫曼编码大作业
    kohnv
        12
    kohnv  
       2018-02-23 22:12:39 +08:00
    这个字符串里的每一个 0 和 1 看上去是 01, 实际上是一个 8 位的 char. 你得写个函数, 通过位运算将 8 个 0/1 的 char 转成一个字节.
    aheadlead
        13
    aheadlead  
       2018-02-23 22:17:35 +08:00
    @emtry 哈哈哈 果然是哈夫曼编码
    其实我也干过同样的事情

    这作业老师没要求的话 其实你就用文本存 0101 也无妨 这门课里重要的是算法

    实在有限制的话 因为写文件只能是以 byte 为单位 你就把读写 bit 的步骤封装一层
    aheadlead
        14
    aheadlead  
       2018-02-23 22:31:15 +08:00
    @emtry
    这位兄弟 @kohnv 说的对,
    '0' 的 ascii 码是 48,48 的二进制表示是 00110000 ;
    '1' 的 ascii 码是 49,49 的二进制表示是 00110001。

    字符串 "01011" 实际上是 40 (五个字符)+8 (结束符 '\0') 个 bit:
    0011 0000 0011 0001 0011 0000 0011 0001 0011 0001 0000 0000
    (理论上没有中间的空格的,只是为了好看)

    ---

    而 "v2ex" 这个字符串,通过查 ascii 表 可知,其实他是 40 个 bit 组成的:
    0111 0110 0011 0010 0110 0101 0111 1000 0000 0000

    0111 0110 = 'v' = 118
    0011 0010 = '2' = 50
    0101 0111 = 'e' = 101
    0111 1000 = 'x' = 120
    0000 0000 = '\0' = 0

    你可以试试看: printf("%c%c%c%c", 118, 50, 101, 120);
    emtry
        15
    emtry  
    OP
       2018-02-23 23:01:06 +08:00
    @aheadlead
    @kohnv
    ascii 码还是知道的,
    作业写完了,只是想知道怎么真正的实现压缩,
    再写一个函数吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   872 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.