使用输出流创建的二进制输出文件的内容
Posted
技术标签:
【中文标题】使用输出流创建的二进制输出文件的内容【英文标题】:Content of Binary Output File Created With Output Stream 【发布时间】:2009-03-26 08:23:19 【问题描述】:此代码编译并执行。它只是打印内容 成二进制格式。但是输出与我的预期不同,即:
-
输出文件大小应该比使用 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;
【问题讨论】:
我不是 C++ 程序员,但我很惊讶显然没有人创建一个类来与 pack 交互。这个问题在谷歌上出现了很多。 【参考方案1】:输出文件大小应该很大 比那些创建的更小 std::cout
您的意思是“使用 std::cout 创建”? 如果您要保存整数而不是字符串,它可能会小一点。
输出文件的内容应该是 压缩,因此当我们打开它时 编辑,我们应该看不到 内容。
不,它不应该被压缩。您可以使用 Boost.Iostreams 库 http://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.html 来创建压缩文件。
为了便于理解,您可以认为二进制文件包含在调试器中查看内存时可以看到的信息。
对于以二进制格式输出,您应该对所有矢量项使用写入流方法(如果使用std::vector < int >
,它会有所不同)。 (对于输出 \t 你可以使用运算符
【讨论】:
【参考方案2】:您必须以二进制格式(不是文本)写入数据:
void WriteStr2BinFh(const string& St, ostream &fn)
char *p = 0;
long l = strtol(St.c_str(), &p);
fn << l;
你必须知道像 long 这样的类型有一些最大值,所以你可能不得不将你的字符串分成 n 个片段并保存为 n 个 long。
【讨论】:
【参考方案3】:输出文件的内容应该被压缩,所以当我们在编辑器中打开它时,我们应该看不到内容。
恐怕 IOStream 库不会对您的输出应用任何压缩。正如 bb 指出的那样,您应该使用另一个库来压缩您的流。
输出文件的大小应该比使用 std::cout 创建的要小得多。
作为前一个参数的结果,被视为字节流(恰好是 ASCII 表示的字符)的输出被“按原样”写入文件,因此大小不会改变.
看看一些documentation 和better explanation 的一般二进制文件。
【讨论】:
以上是关于使用输出流创建的二进制输出文件的内容的主要内容,如果未能解决你的问题,请参考以下文章