在VC上尝试输入输出宽字符时发现,wcout.imbue调用,居然会影响wcin
wstring t;
wcin >> t; //没问题
wcout.imbue(locale("chs"));
wcin >> t; //键入中文时有问题
而对wclog, wcerr调用imbue,则不对cin产生影响。也就是说,wcout和wcin之间有奇特的关系。对wcin调用imbue,不会影响wcout,反过来,对wcout调用imbue,则对wcin产生影响。很显然,丛语义学上来说,这是极不自然,而且极其隐晦。wcout和wcin从语义学上来说,这两者完全是独立的。我察看了源代码,看上去似乎是fgetc这个C库的缓冲处理上有问题,但没有细究下去。
我觉得,这是vc iostream库的bug.不知道我是否可以向ms提交该bug ^_^
wstring t;
wcin >> t; //没问题
wcout.imbue(locale("chs"));
wcin >> t; //键入中文时有问题
而对wclog, wcerr调用imbue,则不对cin产生影响。也就是说,wcout和wcin之间有奇特的关系。对wcin调用imbue,不会影响wcout,反过来,对wcout调用imbue,则对wcin产生影响。很显然,丛语义学上来说,这是极不自然,而且极其隐晦。wcout和wcin从语义学上来说,这两者完全是独立的。我察看了源代码,看上去似乎是fgetc这个C库的缓冲处理上有问题,但没有细究下去。
我觉得,这是vc iostream库的bug.不知道我是否可以向ms提交该bug ^_^