1

我正在尝试从文件中创建一个可以标记的字符串。有效的是

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("file.txt");
boost::char_separator<char> sep(",");
std::string buf(file->begin(),file->end())
boost::tokenizer<boost::char_separator<char>> tokeniser(buf,sep);

但我不会不必要地将文件的缓冲区复制到我认为可以做到的字符串中:

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("file.txt");
boost::iterator_range<const char*> it = make_iterator_range(file->begin(),file->end());
boost::tokenizer<boost::char_separator<char>> tokeniser(it,sep);

或者

std::istringstream buf;
buf.rdbuf()->pubsetbuf(const_cast<char*>(file->data()),file->size());
boost::char_separator<char> sep(",");
boost::tokenizer<boost::char_separator<char>> tokeniser(buf,sep);

我也试过

boost::tokenizer<boost::char_separator<char>> tokeniser(boost::as_literal(file->data()),sep);

但是每次标记器不接受迭代器

有没有一种有效的便携方式来做到这一点?

编辑我认为可能的答案可以解决这个问题

从那以后我想到的是使用 istream 迭代器来实现非复制,因为我相当(尽管不是 100%)确信迭代器会迭代并且不会复制其基础数据

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("names.txt");
std::istream in(&file);
std::istream_iterator<std::string> iter(in);
boost::char_separator<char> sep(",");
boost::tokenizer<boost::char_separator<char>> tokeniser(*iter,sep);

想法?还是有更好的东西?

4

0 回答 0