1

データをシリアル化するために ifstream と ostream を使用していますが、驚いたことに、「<<」演算子は隣接する 2 つの文字列を分離できず、それらを分離するのは非常に複雑です。

class Name
{
string first_name;
string last name;


friend std::ostream& operator<< (std::ostream& os, const Name& _name)
{
     os << _name.first_name << _name.last_name; 
     return os;
}

friend std::istream& operator>> (std::istream& is, Name& _name)
{
     is >> _name.first_name >> _name.last_name;

     return is;
}

<< と >> は null ターミネータ文字を書き込まず、ifstream は変数 (first_name) の文字列全体を読み取るため、これはうまくいきません。2 つの文字列を別々に保存して、別々に読み取ることができるようにするにはどうすればよいですか? ostream ですべての文字列を連結する動機が何なのか理解<<できないので、それらを個別に読み取ることができません!?

4

3 に答える 3

2

<< ostream のすべての文字列を連結する動機が理解できないので、個別に読み戻すことができません!?

これは、それらを個別に書き込む唯一の理由は、それらを個別の文字列として読み取ることであると想定しています。誰かがセパレーターなしでストリームに書き込みたい文字列のペアを持っている場合を考えてみましょう。または、区切り文字が不要な文字列の後にフロートが続きます。

ostreamすべての出力に区切り記号が自動的に挿入された場合、誰かが区切り記号なしで<<テキストを書くことははるかに困難になります。これらの文字列や値を手動で単一の文字列に連結し、それを出力する必要があります。

そして、彼らはこの連結に何を使用しますか? ostringstreamと同じ機能を使用するため、通常のように使用することはできませんofstream。したがって、every<<は区切り文字をストリームに挿入します。

要するに、IO ストリーム API は、ユーザーが「書きたい」または「書きたくない」ものではなく、ユーザーが書き込むように指示したものを書き込みます。これはシリアル化 API ではありません。C++ は C# でも Java でもありません。深刻なシリアル化機能が必要な場合は、Boost.Serializationを使用してください。

于 2012-10-12T21:15:29.367 に答える
1

ifstreamofstream基本的にストリームであるため、データの制限を示すものは何もありません。それらを川と考えてください。すべてのデータはそれらから読み書きできます。これはファイルの本来の性質であるため、シリアル化にファイルが必要な場合は、シリアル化メカニズムを実装するか、この目的のために設計されたライブラリを使用する必要がありますboost::serialization。C++ では、すべてがそのまま実装されているため、最大のパフォーマンスを得ることができます!! :)

于 2012-10-12T21:20:54.713 に答える
1

ostream文字列を(通常は )で連結したいことがよくありますstringstream。特にそれらを連結したくない場合は、簡単に実行できます。

os << _name.first_name << '\n' << _name.last_name;

于 2012-10-12T20:44:55.070 に答える