#define BOOST_ALL_DYN_LINK #include #include #include #include #include #include #include using namespace std; using namespace boost::iostreams; class ActualDevice { private: char* in; char* pIn; char* epIn; char out[ 1024 ]; char* pOut; char* epOut; public: ActualDevice() { in = "123 abc"; pIn = in; epIn = pIn + strlen( in ); pOut = out; epOut = pOut + 1024; } std::streamsize read( char* s, std::streamsize n ) { if( pIn >= epIn ) return -1; char* ps = s; char* eps = ps + n; while( ps < eps && pIn < epIn ) *ps++ = *pIn++; return ps - s; } std::streamsize write( const char* s, std::streamsize n ) { if( pOut >= epOut ) throw std::ios_base::failure( "can't write past end" ); const char* ps = s; const char* eps = ps + n; while( ps < eps && pOut < epOut ) *pOut++ = *ps++; return ps - s; } }; class SomeDevice : public device { private: ActualDevice& d; public: SomeDevice( ActualDevice& d ) : d( d ) {} ActualDevice& getActualDevice() { return d; } std::streamsize read( char* s, std::streamsize n ) { return d.read( s, n ); } std::streamsize write( const char* s, std::streamsize n ) { return d.write( s, n ); } }; int _tmain(int argc, _TCHAR* argv[]) { std::locale utf8Locale( std::locale::classic(), new boost::program_options::detail::utf8_codecvt_facet ); ActualDevice dev; SomeDevice sd( dev ); typedef code_converter cvt; cvt cd( sd ); cd.imbue( utf8Locale ); boost::iostreams::stream io( cd ); io << L"output"; io.flush(); int i; io >> i; wcout << L"i = " << i << endl; wstring s; io >> s; wcout << L"s = " << s << endl; return 0; }