VC9のストリームとロケール

http://d.hatena.ne.jp/y-hamigaki/20070211#1171206100
VC9EE日本語版が出たのでようやく試してみました。

#include <cassert>
#include <clocale>
#include <fstream>
#include <iostream>
#include <locale>

int main()
{
    std::locale loc("");

    // ofstreamのため必要
    std::setlocale(LC_ALL, "");

    std::ofstream os("日本語.txt");
    assert(!!os);

    // コンソールのコードページと同じなので"C"のままでも書ける
    std::cout << std::cout.rdbuf()->getloc().name() << std::endl;
    std::cout << "こんにちは、世界!" << std::endl;

    // ロケールを設定してもOK
    std::cout.imbue(loc);
    std::cout << std::cout.rdbuf()->getloc().name() << std::endl;
    std::cout << "こんにちは、世界!" << std::endl;
    std::cout.imbue(std::locale::classic());
}

というわけでバッファの手動設定は不要のようです。


もう一つテスト。

#include <iostream>
#include <locale>

int main()
{
    std::cout << "こんにちは、世界!a" << std::endl;    // OK
    std::wcout << L"こんにちは、世界!b" << std::endl;  // NG

    // failbitをクリア
    std::cout.clear();
    std::wcout.clear();

    // ロケールを設定してみる
    std::locale loc("");
    std::cout.imbue(loc);
    std::wcout.imbue(loc);
    std::cout << "こんにちは、世界!c" << std::endl;    // OK
    std::wcout << L"こんにちは、世界!d" << std::endl;  // OK

    std::cout.clear();
    std::wcout.clear();

    // バッファリングをオフにしてみる
    std::cout.rdbuf()->pubsetbuf(0, 0);
    std::wcout.rdbuf()->pubsetbuf(0, 0);
    std::cout << "こんにちは、世界!e" << std::endl;    // OK
    std::wcout << L"こんにちは、世界!f" << std::endl;  // NG

    std::cout.clear();
    std::wcout.clear();

    // 再度ロケールを設定してみる
    std::cout.imbue(loc);
    std::wcout.imbue(loc);
    std::cout << "こんにちは、世界!g" << std::endl;    // OK
    std::wcout << L"こんにちは、世界!h" << std::endl;  // OK
}

EEにはCRTのソースが付いてないので推測するしかありませんが、この結果を見る限り、ロケールを吹き込んだときに必要なバッファが自動的に設定されているっぽいです。