此代码编译并执行。它只是打印内容 成二进制格式。但是输出与我的预期不同,即:
但为什么下面的代码没有像我希望的那样呢?我该如何相应地修改它?
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
void WriteStr2BinFh(const string& St, ostream &fn)
{
fn.write(St.c_str(), St.length());
}
int main ( int arg_count, char *arg_vec[] ) {
vector <string> Tags;
// In principle we have millions of such tags
// Hence we need to compress it into binary output.
Tags.push_back("0000000000");
Tags.push_back("0000101110");
Tags.push_back("0133030122");
Tags.push_back("0133132033");
Tags.push_back("1002013320");
Tags.push_back("1111111111");
Tags.push_back("1301013133");
Tags.push_back("3010112111");
Tags.push_back("3203012113");
Tags.push_back("3203012212");
//prn_vec<string>(Tags, "\t");
//cout << endl;
ofstream outfile;
outfile.open("MyOut.bin", ios::binary|ios::out);
for (unsigned i=0; i <Tags.size(); i++) {
WriteStr2BinFh(Tags[i]+"\t",outfile);
}
outfile.close();
return 0;
}
答案 0 :(得分:3)
输出文件大小应该很多 比那些创造的更小 的std :: COUT
你的意思是“用std :: cout创建”?
如果您保存整数而不是字符串,它可能会小一些。
输出文件的内容应该是 压缩,因此当我们打开它 编辑,我们不应该看到 内容。
不,它不应该被压缩。您可以使用Boost.Iostreams库http://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.html来创建压缩文件。
为了便于理解,您可以认为二进制文件包含在查看内存时可以在调试器中看到的信息。
另外,对于以二进制格式输出,您应该对所有矢量项使用写入流方法(如果std::vector < int >
,它将有差异)。 (对于输出\ t,您可以使用运算符&lt;&lt;&lt;)
答案 1 :(得分:1)
您必须以二进制格式(而非文本)写入数据:
void WriteStr2BinFh(const string& St, ostream &fn)
{
char *p = 0;
long l = strtol(St.c_str(), &p);
fn << l;
}
你必须知道像long这样的类型有一些最大值,所以你可能需要将你的字符串分成n个部分并保存为n个长。
答案 2 :(得分:1)
输出文件的内容应该被压缩,因此当我们在编辑器中打开它时,我们应该无法看到内容。
我担心IOStream库不会对您的输出应用任何压缩。正如bb指出的那样,你应该使用另一个库来压缩你的流。
输出文件大小应该比使用std :: cout。
创建的大小小得多
作为前一个参数的结果,输出被视为字节流(恰好是ASCII表示的字符)被“按原样”写入文件,因此,大小不会改变
一般来看一些documentation和better explanation个二进制文件。