Здравствуйте.
$ locale -a
C
POSIX
ru_RU
ru_RU.cp1251
ru_RU.koi8
ru_RU.utf8
// t.cpp
#include <fstream>
#include <iostream>
#include <locale>
using namespace std;
int main()
{
if(true){
wofstream f("wstream.utf8");
f.imbue(locale("ru_RU.utf8"));
f << L"ю";
}
if(true){
wofstream f("wstream.koi8");
f.imbue(locale("ru_RU.koi8"));
f << L"ю";
}
if(true){
ofstream f("fstream.utf8");
f.imbue(locale("ru_RU.utf8"));
f << "ю";
}
if(true){
ofstream f("fstream.koi8");
f.imbue(locale("ru_RU.koi8"));
f << "ю";
}
}
pavlick@pc ~/er $ g++ t.cpp
pavlick@pc ~/er $ ./a.out
pavlick@pc ~/er $ ls -l
итого 32
-rwxr-xr-x 1 pavlick pavlick 12224 сен 21 16:15 a.out
-rw-r--r-- 1 pavlick pavlick 2 сен 21 16:15 fstream.koi8
-rw-r--r-- 1 pavlick pavlick 2 сен 21 16:15 fstream.utf8
-rw-r--r-- 1 pavlick pavlick 1937 сен 21 16:10 t.cpp
-rw-r--r-- 1 pavlick pavlick 1 сен 21 16:15 wstream.koi8
-rw-r--r-- 1 pavlick pavlick 2 сен 21 16:15 wstream.utf8
Можно заметить, что смена кодировки локали в wostream меняет кодировку в выходном файле, чего не происходит с fostream.
С одной стороны логично - ведь нужно же как-то писать бинарные файлы, но с другой сторноы - можно было бы договориться об отсутствии конвертации при дефолтной «C» локали, а если я ставлю «ru_RU.koi8», то мне нужна именно она.
Но дело даже не в этом, а в том, что я не нашёл какого-то описания поведения fstream<char> при смене кодировки (листал стандарт, справочник). Может ли кто-то прояснить? Где написано, что fstream<char> никогда не меняет кодировку?