如何将字符串保存为二进制文件

时间:2013-06-16 09:37:48

标签: c++

继承我的代码

    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的流

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

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

以下是一个例子:

#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

如果我对写入“text”文件的行进行注释,并取消注释写入“binary”文件的行,我得到:

$ od -c binary
0000000   H   e   l   l   o   ,       W   o   r   l   d   !  \n
0000016

od是来自UNIX / Linux的命令,显示文件的确切内容)

现在,为了实际回答你的问题,这里有一个关于你如何“手动”做到这一点的例子。使用bitset,如在接受的答案中,可能是一种更明智的方法:

#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();
}

答案 2 :(得分:1)

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