fstream 怎么输出二进制文件

2018-02-23 20:19:10 +08:00
 emtry
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

2400 次点击
所在节点    C
15 条回复
wevsty
2018-02-23 20:56:08 +08:00
附加了 ios::binary 标志位就是按照二进制方式写入的。

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

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

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

实在有限制的话 因为写文件只能是以 byte 为单位 你就把读写 bit 的步骤封装一层
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
2018-02-23 23:01:06 +08:00
@aheadlead
@kohnv
ascii 码还是知道的,
作业写完了,只是想知道怎么真正的实现压缩,
再写一个函数吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/432030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX