次の行を含む入力ストリームがあります。
# <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 回のパスしか許可されていないことに注意してください。