10 Ocak 2018 Çarşamba

asio streambuf'ı InputStream Haline Getirme

Giriş
Şu satırı dahil ederiz.
#include <boost/asio/streambuf.hpp>
#include <boost/asio/buffer.hpp>
Örnek - primitive okuma
Önce yazıp sonra okumak için şöyle yaparız
boost::asio::streambuf sb;

// now write:
{
    std::ostream os(&sb);
    os << "Hello 1 2 3" << std::flush;
}

// or read:
{   std::istream is(&sb);
    std::string s;
    int a, b, c;
    is >> s >> a >> b >> c;
}
Örnek - satır okuma
Şöyle yaparız.
std::string extract_istream(asio::streambuf& sb)
{
  std::istream is(std::addressof(sb));
  std::string line;
  std::getline(is, line);
  return line;
}
Örnek - satır okuma
streambuf nesnesi şöyle bir string ile dolu olsun.
Love is a beautiful thing\n
Way more beautiful than money\n
It is clear that
Satır satır okumak için şöyle yaparız.
istream is(&buffer);
for (std::string line; getline(is, line); )
  // process the line
3 tane satır okuruz. Son satır \n ile bitmediği halde stream'in sonu olduğu için okunur.

Örnek - satır okuma
Satır okumak için şöyle yaparız.
boost::asio::streambuf buf;

/*put data into buf*/
std::istream is(&buf);
std::string line;
std::getline(is, line);
Örnek - satır okuma
Şöyle yaparız.
boost::asio::streambuf sb;
auto bytes = boost::asio::read_until(socket, sb, "\r\n\r\n");

std::istream is(&sb);
std::string line;
while (getline(is, line) && !line.empty())    {
  std::cout << "Received: '" << line << "'\n";
}

// sb still contains un-consumed data, if any
Örnek - tümünü string olarak okuma
streambuf nesnesine string yazmak ve daha sonra tekrar string elde etmek için şöyle yaparız.
/* Convert std::string --> boost::asio::streambuf */
boost::asio::streambuf sbuf;
std::iostream os(&sbuf);
std::string message("Teststring");
os << message;

/* Convert boost::asio::streambuf --> std::string */
std::string str((std::istreambuf_iterator<char>(&sbuf)),
                 std::istreambuf_iterator<char>());

std::cout << str << std::endl;
Şöyle yaparız.
asio::streambuf request;
asio::read_until(*sock.get(), request, '\n');

std::string s( (std::istreambuf_iterator<char>(&request)),
                std::istreambuf_iterator<char>() );
Örnek - iterator haline getirme
InputStrem'den iterator almak için şöyle yaparız.
std::istream stream(&buf);
std::istream_iterator<char> begin(stream); std::istream_iterator<char> end;

Hiç yorum yok:

Yorum Gönder