ファイルに保存したい次のコンテナがあります。
std::vector< std::vector< Point > > m_vPoints;
Point
operator<<()
とが定義された基本構造operator>>()
です。
ファイルの形式は次のとおりです。
point0_0 point0_1 point0_2 ... <-- points from m_vPoints[0]
point1_0 point1_1 ... <-- points from m_vPoints[1]
...
ポイント要素は で区切られ','
、ポイントは次のように区切られ' '
ます。
-5,4 6,12 -7,32 ...
12,0 -3,4 ...
私はそのようなファイルを作成することができました:
std::ostream& operator<<(std::ostream &o, ...)
{
for(auto it=m_vPoints.begin(); it!=m_vPoints.end(); ++it)
{
copy(it->begin(), it->end(), std::ostream_iterator<Point>(o," "));
o << endl;
}
return o;
}
そしてそれはうまくいきます。しかし、問題は読み方です。次のことを試すと:
std::istream& operator>>(std::istream &is, ...)
{
int numberOfRows; // assume it is known and valid
m_vPoints.resize(numberOfRows);
for(int i=0; i<numberOfRows; i++)
{
copy(std::istream_iterator<Point>(is), std::istream_iterator<Point>(), std::back_inserter(m_vPoints[i]));
}
return is;
}
すべてのラインのすべてのポイントが に読み込まれm_vPoints[0]
ます。のように見えますがstd::istream_iterator<Point>()
無視されstd::endl
ます。個々のポイントを区切る空白をスキップしたいので、使用is >> noskipws
は機能しません。基本的に、問題は istream からコピーすることですが、ストリームの終わりに達するまでではなく、行末までコピーすることです。ネットで見た例では、cin
スペース文字を無視して、何とか 1 行を解析することができましたが、std::endl
またはで正しく終了しています。'\n'
getline()
また、各行を文字列にコピーしてから文字列を解析する必要があるため、も避けたいと思います。i
代わりに、行をコンテナに直接コピーしたいm_vPoints[i]