wcout是如何工作的?

时间:2011-09-06 16:41:23

标签: c++ visual-c++ console cout

我在控制台应用程序中使用wcout时发现了一个奇怪的问题。

在调用某个函数后,其余的wcout调用根本不起作用。即输出语句没有出现在控制台上。

我注意到在函数中,我使用了一个从未赋值的宽字符数组。

WCHAR wArray[1024];
wcout<<wArray<<endl;

在这次电话会议之后,所有其他wcout都停止了工作。

所以,我只是想知道是什么让wcout与cout不同,以及为什么会出现这个问题,

2 个答案:

答案 0 :(得分:5)

wcout可能正在对输出进行一些unicode验证;如果验证失败,则输出失败。这部分是因为Windows控制台子系统不能很好地处理Unicode。

检查流是否设置了failbitbadbit。重置流(例如wcout.clear())应恢复流功能。

严格地说,coutstd::basic_ostream<char>wcoutstd::basic_ostream<wchar_t> ......而且差异就是真的。只是如果要形成良好的Unicode,对Unicode有更多的要求。

答案 1 :(得分:4)

此示例调用未定义的行为。

operator<<(std::wostream&,const wchar_t*)期望缓冲区为空终止,并在到达第一个L'\0'字符时停止打印字符。如果缓冲区恰好包含空字符(L'\0'),则代码将“正确”运行(尽管输出是不可预测的)。如果没有,则operator<<将继续读取内存,直到遇到内存为止。

您的示例不强制存在空终止符。相比之下,以下内容将打印一个未指定数量的字符,很可能是垃圾字符,但定义明确:

WCHAR wArray[1024];
wArray[1023] = L'\0';
wcout << wArray << endl;