1

ファイルに保存したい次のコンテナがあります。

std::vector< std::vector< Point > > m_vPoints;

Pointoperator<<()とが定義された基本構造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]

4

1 に答える 1