wcout是怎么工作的?
How does wcout work?
在控制台应用程序中使用wcout时,我注意到一个奇怪的问题。
调用某个函数后,其余的wcout调用根本不起作用。即输出语句没有出现在控制台上。
我注意到在函数中,我使用了一个从未赋值的宽字符数组。
WCHAR wArray[1024];
wcout<<wArray<<endl;
在这个电话之后,所有其他的wout都停止工作了。
所以,我只是想知道wcout和cout有什么不同,为什么会出现这个问题,
wcout
可能正在对输出进行一些unicode验证;如果验证失败,则输出失败。这部分是因为Windows控制台子系统不能很好地处理Unicode。
检查流是否设置了failbit
或badbit
。重置流(例如wcout.clear()
)应该可以恢复流的功能。
严格来说,cout
是std::basic_ostream<char>
, wcout
是std::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;
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- wcout 和 wcerr:如何让它与 unicode 一起工作
- wcout是怎么工作的?