题
该代码编译并执行。它只是打印内容 转换为二进制格式。但是输出与我的预期不同,即:
- 输出文件大小应该比使用 std::cout 创建的文件小得多。
- 输出文件的内容应该被压缩,因此当我们在编辑器中打开它时, 我们不应该看到内容。
但为什么下面的代码没有达到我希望的效果呢?我怎样才能相应地修改它?
#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;
}
解决方案
您必须以二进制格式(而不是文本)写入数据:
void WriteStr2BinFh(const string& St, ostream &fn)
{
char *p = 0;
long l = strtol(St.c_str(), &p);
fn << l;
}
您必须注意,像 long 这样的类型有一些最大值,因此您可能必须将字符串拆分为 n 段并保存为 n 个 long。
其他提示
输出文件大小应该很大 比那些创建的人更小 标准::cout
你的意思是“用 std::cout 创建”?
如果您要保存整数而不是字符串,它可能会小一些。
输出文件的内容应为 压缩,因此当我们打开它时 编辑,我们应该看不到 内容。
不,它不应该被压缩。您可以使用 Boost.Iostreams 库 http://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.html 用于创建压缩文件。
为了便于理解,您可以认为二进制文件包含您在查找内存时可以在调试器中看到的信息。
另外,为了以二进制格式输出,您应该对所有向量项使用写入流方法(如果有) std::vector < int >
会有区别)。(对于输出 您可以使用运算符 << )
不隶属于 StackOverflow