boost::asio::windows::stream_handleは、Windowsのハンドルを持つことができるストリーム型。
これを使うと、ファイルの非同期読み込みができる。サンプルはよくないですが、こんな感じです。
a.txt
Hello
#include <iostream> #include <vector> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/ref.hpp> #include <boost/scope_exit.hpp> namespace asio = boost::asio; void read_end(const boost::system::error_code& error, const std::vector<char>& result) { if (error) std::cout << error.message() << std::endl; else { const std::string s(result.begin(), result.end()); std::cout << "success : " << s << std::endl; } } int main() { asio::io_service io_service; HANDLE handle = ::CreateFileA("a.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (handle == INVALID_HANDLE_VALUE) { std::cout << "cannot open" << std::endl; return 1; } BOOST_SCOPE_EXIT((&handle)) { ::CloseHandle(handle); } BOOST_SCOPE_EXIT_END; std::vector<char> buffer(::GetFileSize(handle, NULL)); asio::windows::stream_handle file(io_service, handle); asio::async_read(file, asio::buffer(buffer.data(), buffer.size()), boost::bind(read_end, _1, boost::ref(buffer))); io_service.run(); for (;;) {} }
Success : Hello
参照:
Stream-Oriented HANDLEs - Boost Asio Library