我有一个以下容器,我想将其存储在一个文件中:
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
某种方式设法解析一行,忽略空格字符,但正确地以std::endl
or结尾'\n'
我也想避免getline()
,因为那时我必须将每一行复制到一个字符串,然后解析该字符串。相反,我想将行i
直接复制到容器m_vPoints[i]