Robert Ramey wrote:

How does this strike you?

text_iarchive(Stream &_is) : is(_is)
{
// archives always use classic locale
#ifndef BOOST_NO_STD_LOCALE
plocale = is.imbue(std::locale::classic());
#endif
init();
}
~text_iarchive(){
#ifndef BOOST_NO_STD_LOCALE
is.imbue(plocale);
#endif
}
This solution does not address the objections in my last post in the original thread. You seem really concerned about this. We could meet in the middle with this solution, instead:

text_iarchive(Stream &_is, bool _overrideLocale = true) :
is(_is)
{
// archives always use classic locale
#ifndef BOOST_NO_STD_LOCALE
if(_overrideLocale)
plocale = is.imbue(std::locale::classic());
else
plocale = is.getloc();
#endif
init();
}

Another observation:

I note that my test.cpp program includes wchar_t member variables initialized to values in excess of 256.
The system doesn't seem to lose any informaton in storing/loading to a stream with classic locale.
Which platform are you working on? On Win32, VC++ 6sp5, STLport the following test program produces the output 52 (0x34) instead of 4660 (0x1234). According to the standard, this behaviour is perfectly conformant. (the ios::binary is required, because the I/O library could apply CRLF translation to a part of a two-byte character).

#include <iostream>
#include <fstream>

int main()
{
wchar_t a = L'\x1234';

std::wofstream out("test.txt", std::ios::binary);
out << a;
out.close();

std::wifstream in("test.txt", std::ios::binary);
in >> a;
in.close();

std::cout << unsigned(a) << std::endl;
return 0;
}

If this code produces the correct output on your platform, either your char type has 16 bits or *your* platform is non-conformant, according to my interpretation of the standard.

Alberto Barbati



_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to