2

这是我的代码

    bool saveFile (string name, string contents)
{
    ofstream file;
    file.open(name.c_str(), ios::binary);
    file.write(contents.c_str(),contents.size());
    file.close();

}

好的编辑:

我的字符串包含

10100101111111110000

当我将它保存为二进制文件并使用记事本打开时,我希望看到 ascii 表中的随机字符,但我看到的是完全相同的 0 和 1 流

4

3 回答 3

2

如果您有'1''0'字符的“二进制”文本字符串,您可以使用std::bitset<8>.

void saveFile (std::string name, std::string contents) {
    std::ofstream file(name.c_str(), std::ios::binary);
    for ( std::size_t byte = 0; byte < contents.size(); byte += 8 ) {
        file.put( std::bitset< 8 >( contents, byte, // convert one byte
          std::min( (std::size_t) 8, contents.size() - byte ) // or as many bits as are left
          .to_ulong() ); // to two's complement representation
    }
}
于 2013-06-16T10:00:58.087 回答
1

您将可读字符(表示数字字符“1”和“0”)写入二进制文件,因此当您在编辑器中查看它时,您可以阅读它。如果要读取“垃圾”,则需要将“垃圾”——“不可读”字符写入“可打印”字符(a-zA-Z0-9!@#$%^等)范围之外的文件。

于 2013-06-16T10:19:10.347 回答
1

粗略地说,二进制文件和文本文件之间的主要区别在于,您写入第一个字节的每个字节都保持不变,而写入第二个字节的换行符可能会转换为底层系统的换行符序列,例如回车 + 换行符视窗。

这是一个例子:

#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();
}
于 2013-06-16T09:48:37.310 回答