コンテンツのバイナリ出力ファイル作成された出力ストリーム
-
22-08-2019 - |
質問
このコードを編集などを実行することを示しています。すでに印刷コンテンツ バイナリ形式です。ただし、出力が異なるから予想をはるか、すなわち、
- 出力ファイルサイズは小さくな方で作成した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;
}
あなたはおそらくn個にあなたの文字列を分割し、n個のlong型として保存する必要がありますので、あなたは、長い間のようなタイプは、いくつかの最大値を持っていることを認識する必要があります。
他のヒント
出力ファイルのサイズは非常にする必要があります で作成されたものより小さな std :: coutの
あなたが何を意味するか "のstd :: coutを使用して作成"?
あなたはint型ではなく、文字列が保存されます場合は少し小さくなる可能性があります。
出力ファイルの内容は次のようになります 圧縮され、それゆえ我々はそれを開いたとき エディタは、我々は見ることはできないはず コンテンツます。
いいえ、それは圧縮すべきではありません。あなたは、ライブラリ HTTP Boost.Iostreamsを使用することができます:// WWW .boost.org / DOC / libsに/ 1_38_0 / libsに/入出力ストリーム/ DOC / index.htmlをzip形式のファイルを作成するためにを。
理解を容易にするために、あなたは、バイナリファイルがメモリを見ますときに、デバッガで見ることができる情報が含まれていることを考えることができます。
またbinnary形式で出力するために、あなたは(std::vector < int >
の場合には、それは違いがあります)すべてのベクトルの項目の書込みストリーム・メソッドを使用する必要があります。