0

此代码编译并执行。它只是将内容打印成二进制格式。但是输出与我的预期不同,即:

  1. 输出文件的大小应该比使用 std::cout 创建的要小得多。
  2. 输出文件的内容应该被压缩,因此当我们在编辑器中打开它时,我们应该看不到内容。

但是为什么下面的代码没有像我希望的那样做呢?我该如何相应地修改它?

#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;
}
4

3 回答 3

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 您可以使用运算符 << )

于 2009-03-26T08:34:48.317 回答
1

您必须以二进制格式(不是文本)写入数据:

void WriteStr2BinFh(const string& St, ostream &fn)
{
char *p = 0;
long l = strtol(St.c_str(), &p);
fn << l;
}

你必须知道像 long 这样的类型有一些最大值,所以你可能不得不将你的字符串分成 n 部分并保存为 n 个 long。

于 2009-03-26T08:46:59.007 回答
1

输出文件的内容应该被压缩,因此当我们在编辑器中打开它时,我们应该看不到内容。

恐怕 IOStream 库不会对您的输出应用任何压缩。正如 bb 指出的那样,您应该使用另一个库来压缩流。

输出文件的大小应该比使用 std::cout 创建的要小得多。

由于前面的参数,输出被视为字节流(恰好是 ASCII 表示的字符)被“按原样”写入文件,因此大小不会改变。

看看一些文档和对二进制文件的更好解释

于 2009-03-26T08:47:29.630 回答