我有一个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;
}
我希望输出为10个字符长,但仅为"{"
。如果我取消注释std::istream_iterator<char> end { is };
行并注释掉下一行,则输出仅为""
。
我想念的是什么?我不能使用这样的迭代器吗?
我知道我可以创建一个char[]
作为缓冲区,将其复制到缓冲区中,依此类推,但这似乎不那么简单。
std::next(beg, someLength)
时,将读取someLength
字符。然后beg
无效。此外,std::istream_iterator
不应计入。由于处理流错误的方式,它被设计为与默认构造的迭代器进行比较。如果您尝试对它们进行计数,那么它们将有时再读一遍,具体时间取决于算法的实现方式。]
如果要从输入流中读取n
字符,只需使用read
。如果要跳过空格,则只需编写一个循环。如果您想以非预期方式使用std::istream_iterator
,那么您的代码将无法预期地失败。