RL-*_*L-S 5 c++ stdstring istream-iterator istream input-iterator
我有一个istream并且需要将两个分隔符之间的内容复制到一个std::string. 我可以找到定界符' streampos,但是当尝试使用它istream_iterator<char>来遍历流的部分时,它不起作用。这是我尝试过的:
#include <iostream>
#include <sstream>
#include <iterator>
std::string copyToString( std::istream& is )
{
is >> std::ws;
auto someLength {10};
std::istream_iterator<char> beg {is};
is.seekg( someLength, std::ios::cur );
//std::istream_iterator<char> end { is };
std::istream_iterator<char> end { std::next(beg, someLength) };
return std::string{ beg, end };
}
int main()
{
std::stringstream ss;
ss.str( " { my string content }" );
std::cout << "\"" << copyToString( ss ) << "\"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计输出长度为 10 个字符,但它只是"{". 如果我取消注释该行std::istream_iterator<char> end { is };并注释掉下一行,则输出只是"".
我错过了什么?我不能使用这样的迭代器吗?
我知道我可以创建一个char[]缓冲区,将它复制到那个缓冲区,等等,但这似乎不那么简单。
std::istream_iterator是一个输入迭代器。输入迭代器是单遍的,并且当其副本递增时失效。当您这样做时std::next(beg, someLength),您会读取someLength字符。那么就beg失效了。
而且,std::istream_iterator不打算被计算在内。由于处理流错误的方式,它被设计为与默认构造的迭代器进行比较。如果您尝试对它们进行计数,那么它们有时会再读取一次,具体取决于算法的实现方式。
如果您想n从输入流中读取字符,只需使用read. 如果你想跳过空格,那就写一个循环吧。如果您想std::istream_iterator以非预期的方式使用,那么您的代码将不可预测地失败。