덧글 외에도 asio::streambuf
과 상호 작용하는 두 가지 방법을 보여주는 간단한 데모 프로그램이 있습니다.
편도는 streambuf를 I/O 스트림으로 랩핑하고, 다른 방법은 준비/커밋 및 데이터/소비로 직접 액세스를 사용합니다.
#include <boost/asio.hpp>
#include <iostream>
#include <string>
#include <algorithm>
#include <memory>
namespace asio = boost::asio;
void direct_insert(asio::streambuf& sb, std::string const& data)
{
auto size = data.size();
auto buffer = sb.prepare(size);
std::copy(begin(data), end(data), asio::buffer_cast<char*>(buffer));
sb.commit(size);
}
void stream_insert(asio::streambuf& sb, std::string const& data)
{
std::ostream strm(std::addressof(sb));
strm << data;
}
std::string extract_istream(asio::streambuf& sb)
{
std::istream is(std::addressof(sb));
std::string line;
std::getline(is, line);
return line;
}
std::string extract_direct(asio::streambuf& sb)
{
auto buffer = sb.data();
auto first = asio::buffer_cast<const char*>(buffer);
auto bufsiz = asio::buffer_size(buffer);
auto last = first + bufsiz;
auto nlpos = std::find(first, last, '\n');
auto result = std::string(first, nlpos);
auto to_consume = std::min(std::size_t(std::distance(first, nlpos) + 1), bufsiz);
sb.consume(to_consume);
return result;
}
int main()
{
asio::streambuf buf;
direct_insert(buf, "The cat sat on the mat\n");
stream_insert(buf, "The cat sat on the mat\n");
auto s1 = extract_direct(buf);
auto s2 = extract_istream(buf);
std::cout << s1 << "\n" << s2 << "\n";
}
'commit()'및'consume()'함수를 올바르게 사용하고 있습니까? 확인을 위해 내 IDE에 붙여 넣을 수있는 최소의 완전한 코드를 보여줄 수 있습니까? –
커밋 또는 소비 기능을 사용하지 않습니다. 난 단지 std :: istream을 위해 streambuffer를 사용하고 istreambuf_iterators를 사용한다. 약간의 실험을 한 후에 나는 문제를 발견했다 : std :: copy_n은 반복자로 이상한 일을하고있다. while 루프를 사용하고 ++ 연산자를 호출하면 문제가 없습니다. 커밋을 사용하지 않거나 streambuf에서 ostream 또는 istream을 만드는 것으로 잘못된 것이 있습니까? – Gustavo
istream 또는 ostream에서 streambuffer를 사용하면 커밋/소비 메커니즘이 완성됩니다. –