粗略地说,二进制文件和文本文件之间的主要区别在于,您写入第一个字节的每个字节都保持不变,而写入第二个字节的换行符可能会转换为底层系统的换行符序列,例如回车 + 换行符视窗。
这是一个例子:
#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();
}