fstream 怎么输出二进制文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
emtry
V2EX    C

fstream 怎么输出二进制文件

  •  
  •   emtry 2018-02-23 20:19:10 +08:00 2894 次点击
    这是一个创建于 2803 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 00100110 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     Solana     5783 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:54 PVG 10:54 LAX 19:54 JFK 22:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86