2009-03-26 14 views
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; 
} 
+1

私はC++プログラマではありませんが、私は本当に誰もパックとのインターフェースを作成するクラスを作成していないことに本当に驚いています。この質問はかなりGoogleに表示されます。 –

答えて

1

(あなたがオペレータ< <を使用することができ、出力\ tについて)あなたのストリングをn個に分割し、n個のロングとして保存する必要があります。

3

出力ファイルのサイズは、それらが のstd :: coutを使用すると、 "STD :: coutを使用して作成" 何を意味

で作成したことをずっと 小さくすべきですか?
文字列ではなくintを保存する場合は、少し小さくなる可能性があります。

出力ファイルの内容が は圧縮されなければならない、我々は エディタで開くと、それゆえ、我々は コンテンツを見ることはできないはずです。

いいえ、それは圧縮すべきではありません。 Boost.Iostreamsライブラリhttp://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.htmlを使ってzipファイルを作成することができます。

は、理解を容易にするために、あなたは、バイナリファイルがメモリを見ますときに、デバッガで見ることができる情報が含まれていることを考えることができます。

もbinnary形式で出力するために、あなたは(std::vector <int>の場合には、それは違いがあります)すべてのベクトルの項目の書込みストリーム・メソッドを使用する必要があります。あなたが長いのようなタイプは、いくつかの最大値を持っていることを認識しなければならない

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

ので、あなた:あなたはバイナリ形式(テキストではなく)にデータを書き込む必要があります

1

出力ファイルの内容は圧縮されている必要があります。そのため、エディタで開くと、その内容を見ることができません。

IOStreamライブラリは出力に圧縮を適用しないことに恐れています。 bbが指摘するように、あなたのストリームを圧縮するために別のライブラリを使うべきです。

出力ファイルのサイズは、std :: coutで作成したサイズよりもはるかに小さくする必要があります。従って、ファイルに「そのまま」、及び、(ASCII表現文字ことが起こる)のバイトストリームとして処理され、出力が書き込まれる前の引数の結果として

、サイズ変更されません。

documentationbetter explanationの一般的なバイナリファイルを見てください。

関連する問題