#include #include #include #include #include struct codecvt_test : std::codecvt { codecvt_test(std::size_t refs = 0) : std::codecvt(refs) { } protected: virtual std::codecvt_base::result do_unshift(std::mbstate_t &s,char *from,char *to,char *&next) const { return std::codecvt_base::ok; } virtual int do_encoding() const throw() { return 0; } virtual int do_max_length() const throw() { return 42; } virtual bool do_always_noconv() const throw() { return false; } virtual std::codecvt_base::result do_in( std::mbstate_t &state, char const *from, char const *from_end, char const *&from_next, wchar_t *uto, wchar_t *uto_end, wchar_t *&uto_next) const { *uto++ = L'A'; *uto++ = L'B'; uto_next = uto; from_next = from_end; return std::codecvt_base::ok; } virtual int do_length( std::mbstate_t &state, char const *from, char const *from_end, size_t max) const { return 42; } virtual std::codecvt_base::result do_out( std::mbstate_t &state, wchar_t const *ufrom, wchar_t const *ufrom_end, wchar_t const *&ufrom_next, char *to, char *to_end, char *&to_next) const { return std::codecvt_base::ok; } }; int main() { std::locale old_loc; std::locale loc(old_loc, new codecvt_test); { std::fstream f("test.tmp", std::ios_base::out | std::ios_base::trunc); f << "foobar" << std::endl; } { std::wfstream f("test.tmp"); f.imbue(loc); std::copy(std::istream_iterator(f), std::istream_iterator(), std::ostream_iterator(std::cout, " ")); std::cout << std::endl; } }