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を使用して、zip ファイルを作成できます。

理解しやすいように、バイナリ ファイルには、メモリを参照するときにデバッガで表示できる情報が含まれていると考えることができます。

また、バイナリ形式で出力するには、すべてのベクター項目に書き込みストリーム メソッドを使用する必要があります (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 に答える