1

次の行を含む入力ストリームがあります。

# <int> <int>
<some_data_type> <some_data_type> <some_data_type> ..... <some_data_type>
<some_data_type_1> <some_data_type_2> <some_data_type_3> <some_data_type_1> <some_data_type_2> <some_data_type_3> .... <some_data_type_1> <some_data_type_2> <some_data_type_3> 

上記のストリームでは、3 行すべてが異なるため、異なる方法で解析する必要があります。現在、次のような読み取り方法を使用しています。

void reader( std::istream & is, DataStructure & d ){
  std::string line;
  getline(is,line);
  std::stringstream s(line);
  //parse line 1

  getline(is,line);
  std::stringstream line2(line);
  //parse line 2

  getline(is,line);
  std::stringstream line3(line);
  //parse line 3

 }

std::stringstream行は任意に大きくなる可能性があり、すべてをメモリに2回ロードしたくないため、今のアイデアはまったく使用しないことです。したがって、入力ストリームからユーザー指定のデータ構造 d に直接読み取ることができれば、より良いでしょう。

アイデアは利用することですstd::istream_iteratorが、残念ながら、異なる行には異なる解析ニーズがあります。たとえば、最後の行では、ストリームの 3 つの要素が一緒になって 1 つのデータ要素を構成します。

現時点でもっともらしいと思われる唯一のアイデアは、ストリーム バッファーを直接処理することです。誰かがこれを行うためのより良い方法を推奨できれば、それは素晴らしいことです。

注:のような 3 次データ構造は使用できませんstd::stringstream。ストリームからユーザー提供のデータ構造に直接読み取ることが不可欠です。

編集: ファイルに対して 1 回のパスしか許可されていないことに注意してください。

4

2 に答える 2

1

その後は一切使用std::getline()しないでください。タイプの istream オペレーターを定義し、これらを直接使用します

std::istream &operator >>(std::istream &f, DataStructure &d)
{
    f >> d.member1 >> d.member2 >> ...;
    return f;
}

void reader(std::istream & is, DataStructure &d)
{
    is >> d;
}

ストリーム バッファをいじっstd::istream_iteratorたり、直接操作したりする必要はありません。

于 2012-11-22T10:30:03.693 に答える