Aber warum? Definiere ich bof als basic_ofstream<char>, dann geht's,
allerdings entspricht das ja auch exakt ofstream. Warum gibt es da ein
Problem mit unsigned char (Bzw. mit allem anderen als <char>, auch mit
<short> schlägt write() fehl)?
Dein Quelltext sieht m.E. korrekt aus, ich hätte auch
erwartet, dass es klappt.
Ich habe das mal versucht, nachzuvollziehen.
Unter Linux mit dem gcc 4.3.2 habe ich den gleichen Effekt.
Wenn man vor dem Schreiben mit
einschaltet, daß bei Fehlern eine Ausnahme gewerfen wird, dann
passiert genau das beim Schreiben in basic_ios.h an dieser Stelle:
1
template<typename_Facet>
2
inlineconst_Facet&
3
__check_facet(const_Facet*__f)
4
{
5
if(!__f)
6
__throw_bad_cast();
7
return*__f;
8
}
Weder bei Stroustrup noch bei Josuttis habe ich etwas gesehen,
was da seitens des Aufrufers noch fehlen könnte (außer dass man
bei anderen basic_ofstream<> als char und wchar ggf. explizit die
Datei mit open() öffnen müsste, aber daran liegt es nicht).
Deshalb würde ich mal dreist unterstellen, daß hier die g++-Libs
schwächeln.
Auch wenn es mir schwer fällt zu sagen, aber mit VS2005 klappt
das Schreiben wie erhofft.
In
http://www.unc.edu/depts/case/pgi/pgC++_lib/stdlibcr/cha_3696.htm
steht geschrieben:
"Users have to provide specialization for char_traits if they use
other character types than char and wchar_t."
Wahrscheinlich hängt dein Problem damit zusammen. Ich vermute, dass die
Verwendung anderer Typen als char und wchar_t durch Normalsterbliche gar
nicht vorgesehen ist.
Normalsterbliche nehmen IMHO einfach einen ofstream und casten beim
Aufruf von write den unsigned-char-Zeiger in einen char-Zeiger.
Auch ein auf einen anderen Zeichentyp spezialisierter basic_ostream
versagt spätestens dann, wenn man der write-Methode unterschiedliche
Datentypen binär schreiben möchte, was ja durchaus üblich ist. Dann
hilft sowieso nur noch das Casten des Zeigers.
> Auch wenn es mir schwer fällt zu sagen, aber mit VS2005 klappt das> Schreiben wie erhofft.
Ich vemute, MS hat das char_traits<char> etwas allgemeiner definiert, so
dass es auch für unsigned char funktioniert. Oder sie haben zusätzlich
ein char_traits<unsigned char> definiert. Wenn ich das obige Zitat aber
richtig verstanden habe, ist so etwas im Standard nicht vorgeschrieben.