我有一个std :: ostringstream。 我想迭代这个std :: ostringstream的每一行。
我使用boost :: tokenizer:
std::ostringstream HtmlStream;
.............
typedef boost::tokenizer<boost::char_separator<char> > line_tokenizer;
line_tokenizer tok(HtmlStream.str(), boost::char_separator<char>("\n\r"));
for (line_tokenizer::const_iterator i = tok.begin(), end = tok.end(); i != end; ++i)
{
std::string str = *i;
}
在线
for (line_tokenizer::const_iterator i = tok.begin(), end = tok.end(); i != end;
我有一个断言错误“string iterator incompatible”。 我在google和StackOverflow上也读到了这个错误,但是我发现了我的错误。
有人可以帮我吗?
非常感谢,
致以最诚挚的问候,
Nixeus
答案 0 :(得分:2)
我喜欢将其复制为效率/错误报告:
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <iostream>
#include <vector>
int main()
{
auto const& s = "hello\r\nworld";
std::vector<boost::iterator_range<char const*>> lines;
boost::split(lines, s, boost::is_any_of("\r\n"), boost::token_compress_on);
for (auto const& range : lines)
{
std::cout << "at " << (range.begin() - s) << ": '" << range << "'\n";
};
}
打印:
at 0: 'hello'
at 7: 'world'
这比显示的大多数替代方案更有效。当然,如果您需要更多解析功能,请考虑Boost Spirit:
#include <boost/spirit/include/qi.hpp>
int main()
{
std::string const s = "hello\r\nworld";
std::vector<std::string> lines;
{
using namespace boost::spirit::qi;
auto f(std::begin(s)),
l(std::end(s));
bool ok = parse(f, l, *(char_-eol) % eol, lines);
}
for (auto const& range : lines)
{
std::cout << "'" << range << "'\n";
};
}