Pio*_*r G 1 c++ stl istream-iterator
我有一个以下容器,我想存储在一个文件中:
std::vector< std::vector< Point > > m_vPoints;
Run Code Online (Sandbox Code Playgroud)
Point是一个定义operator<<()和operator>>().的基本结构.
该文件的格式为:
point0_0 point0_1 point0_2 ... <-- points from m_vPoints[0]
point1_0 point1_1 ... <-- points from m_vPoints[1]
...
Run Code Online (Sandbox Code Playgroud)
点元素由分隔',',并且点由' '例如:
-5,4 6,12 -7,32 ...
12,0 -3,4 ...
Run Code Online (Sandbox Code Playgroud)
我设法生成这样一个文件:
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;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.然而问题是阅读.当我尝试以下内容时:
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;
}
Run Code Online (Sandbox Code Playgroud)
所有行的所有点都被读入m_vPoints[0].它看起来像std::istream_iterator<Point>()无视std::endl.使用is >> noskipws不起作用,因为我仍然想跳过分隔各个点的空格.所以基本上,问题是从istream复制,但直到达到流末尾但直到行结束.我在网上看到的示例使用cin某种方式设法解析单行,忽略空格字符,但正确结束于std::endl或'\n'
我也想避免getline(),因为那时我必须将每一行复制到一个字符串然后解析字符串.相反,我想i直接将行复制到容器中m_vPoints[i]
逐行阅读:
std::istream& operator>>(std::istream &is,
std::vector<std::vector<Point>>& points)
{
using namespace std;
using point_itr = istream_iterator<Point>;
string line;
while( getline(is, line) ) // read line by line
{
// iterate points from istringstream into new line vector
istringstream line_in{ line };
points.emplace_back(
make_move_iterator(point_itr{ line_in }),
make_move_iterator(point_itr{}) );
}
return is;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这是规范的解决方案.
我也想避免使用getline(),因为那时我必须将每一行复制到一个字符串然后解析字符串.相反,我想将第i行直接复制到容器m_vPoints [i]
你想避免使用std :: getline吗?
if(is.peek() == '\n')阅读每个点后,您可以在代码中使用.这将使您的代码(更多)变得复杂,因为您将无法再直接从迭代器中复制,并且实际执行此代码的代码将更复杂(您还必须手动处理输入流错误状态).