2
#include <locale>
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
    ofstream fout("test.txt");

    fout.imbue(locale("chs"));
    cout.imbue(locale("C"));

    cout.rdbuf(fout.rdbuf());
    cout << "中文"; // Which locale will apply to here? "C" or "chs"?
}

質問はコードにコメントされています。

4

1 に答える 1

2

http://www.cplusplus.com/reference/ios/ios/imbue/より

std::ios::imbue <ios>

locale imbue ( const locale& loc );

インビュー ロケール

ロケールに依存する操作で使用される新しいロケール オブジェクトとして、ストリームとそれに関連付けられたストリーム バッファー (存在する場合) の両方に loc を関連付けます。

最初のパラメーターとして imbue_event を指定して register_callback に登録されたすべてのコールバック関数が呼び出されます。

実際、このメンバー関数は、継承された同名の ios_base::imbue(loc) を呼び出し、ストリームがストリーム バッファーに関連付けられている場合は、rdbuf()->pubimbue(loc) も呼び出します。

また、http://stdcxx.apache.org/doc/stdlibug/27-4.htmlも参照してください。

27.4.4 ロケールと Iostream のコラボレーション

基本クラス ios_base にはロケール オブジェクトが含まれています。派生ストリーム クラスによって定義されたフォーマットおよび解析関数は、そのロケールの数値ファセットを使用します。

クラス テンプレート basic_ios は、ストリーム バッファーへのポインターを保持します。このストリーム バッファにもロケール オブジェクトがあり、通常はストリーム クラスの関数で使用される同じロケール オブジェクトのコピーです。ストリーム バッファの入力関数と出力関数は、アタッチされたロケールのコード変換ファセットを使用します。

あなたの場合、「C」数値ロケールと「chs」文字ロケールを使用します。

于 2013-02-06T00:12:32.543 に答える