wcout是怎么工作的?

How does wcout work?

本文关键字:工作 wcout      更新时间:2023-10-16

在控制台应用程序中使用wcout时,我注意到一个奇怪的问题。

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

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

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

在这个电话之后,所有其他的wout都停止工作了。

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

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

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

严格来说,coutstd::basic_ostream<char>, wcoutstd::basic_ostream<wchar_t>…这就是区别所在。如果要使Unicode格式良好,那么对Unicode的要求就更多了。

这个例子调用了未定义的行为。

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

null终止符的存在不是由您的示例强制执行的。相比之下,下面的命令将打印未指定数量的字符,很可能是垃圾,但定义良好:

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