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 与流及其关联的流缓冲区(如果有)关联,作为新的区域设置对象,用于区域设置敏感的操作。

调用 register_callback 注册的所有回调函数,其中 imbue_event 作为其第一个参数。

实际上,这个成员函数调用了它继承的同音异义词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 回答