提升asio - 异步读取stdin中已建立的字符数

时间:2014-05-18 08:58:05

标签: boost boost-asio stdin

我想编写boost :: asio应用程序,它正在使用boost :: asio :: streambuf从stdin读取。无论如何,对STDIN_FILENO制作的streambuf唯一有效的函数是boost :: asio :: async_read_until。其他人抛出错误。是否有可能使用boost asio函数从stdin中读取100个第一个字符?

1 个答案:

答案 0 :(得分:0)

原则上这只是起作用

#include <boost/asio.hpp>
#include <boost/asio/posix/stream_descriptor.hpp>

using namespace boost::asio;
using boost::system::error_code;

#include <iostream>

int main()
{
    io_service svc;
    posix::stream_descriptor in(svc, STDIN_FILENO);

    char buf[100];
    async_read(in, buffer(buf,sizeof(buf)), [&](error_code ec, size_t br) { 
            std::cout << std::string(buf, br) << std::flush; 
            if (ec)
                std::cerr << ec.message(); 
        });

    svc.run();
}

用作

cat input.txt | ./test | wc -c

将按预期输出100(并回显输入)。我们甚至可以使用实时终端输入:

./test | wc -c

当输入短于100个字节时,您将获得ec.message()&#34;文件结束&#34;也印了。

在Linux上不起作用是:

 ./test < input.txt

你收到:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
  what():  assign: Operation not permitted

这是因为异步操作不支持常规文件:Strange exception throw - assign: Operation not permitted