粗略地说,二进制文件和文本文件之间的主要区别在于,您写入第一个字节的每个字节都保持不变,而写入第二个字节的换行符可能会转换为底层系统的换行符序列,例如回车 + 换行符视窗。
这是一个例子:
#include <fstream>
#include <ios>
int main() {
std::ofstream file;
std::string s = "Hello, World!\n";
// file.open("binary", std::ios_base::binary);
file.open("text");
file.write(s.c_str(),s.size());
file.close();
}
如果我现在用 g++ 编译这个程序并在 Windows 上运行它,我会得到这个输出:
$ od -c text
0000000 H e l l o , W o r l d ! \r \n
0000017
如果我注释写入“文本”文件的行并取消注释写入“二进制”文件的行,我会得到:
$ od -c binary
0000000 H e l l o , W o r l d ! \n
0000016
(od
是来自 UNIX/Linux 的命令,用于显示文件的确切内容)
现在,要实际回答您的问题,这里有一个示例,说明如何“手动”完成。bitset
在接受的答案中使用 a可能是一种更明智的方法:
#include <fstream>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string s = "10100101111111110000";
std::vector<unsigned char> v;
unsigned char c = 0;
int i = 0;
for ( auto d : s ) {
if ( d == '1' )
++c;
c <<= 1;
++i;
if ( i % 8 == 0 ) {
v.push_back(c);
c = 0;
i = 0;
}
}
if ( i != 0 ) {
c <<= 8 - i;
v.push_back(c);
}
std::basic_ofstream<unsigned char> file;
file.open("binary", std::ios_base::binary);
file.write(v.data(), v.size());
file.close();
}