继承我的代码
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的流
答案 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!@#$%^
等)范围之外的文件中写入“垃圾” - “不可读”字符。