c++ - 混合 std::wcout 和 std::cout 会出错,有什么问题?
问题描述
使用 g++ 编译后,下面的程序std::wcout
仅打印表达式。但是如果你取消注释第 8 行,它会正确打印三个表达式。
我想知道这种奇怪行为的原因。
#include <iostream>
#include <cstring>
#include <boost/format.hpp>
int main () {
int x = 10;
wchar_t str[] = L"Hello, world!";
// std::cout << "what?" << std::endl;
std::wcout << L"str = \"" << str << L"\" | len = " << wcslen(str) << L"\n";
std::cout << boost::format("x = %d | &x = %p") % x % &x << std::endl;
return 0;
}
解决方案
从这个页面引用
程序不应将 cout 上的输出操作与 wcout 上的输出操作(或与 stdout 上的其他面向宽的输出操作)混合:一旦对任一输出操作执行了输出操作,标准输出流就会获取一个方向(窄或宽)这只能通过在标准输出上调用 freopen 来安全地更改。
首次使用时它起作用的原因cout
是因为您的实现允许wcout
输出到面向字节的流。不能保证所有实现都可以。如引用文本中所述,在它们之间切换的唯一正确方法是freopen
这样:
#include <cstdio>
#include <iostream>
int main () {
std::wcout << L"Hello" << std::flush;
freopen(nullptr, "a", stdout);
std::cout << " world\n" << std::flush;
}
但是避免混合它们可能更简单。
推荐阅读
- python - 我的代码在到达 else 和 return 语句时继续运行,我在 if 语句中有递归?答案是 589.45
- pyspark - Pysaprk 数据框根据列唯一值 customerid 写入单独的文件和文件名
- php - PHP - 如何修复 I/O 函数调用在现实世界中不应该受到路径注入攻击?
- r - 如何在公式的右侧调用变量名的串联向量?
- pine-script - 索引 -1 超出范围,数组大小为 0
- python - IndexError:列表索引超出范围 - API
- java - IntelliJ 未运行 Spring Boot 调试器
- windows - 覆盖一个特定窗口的程序
- c# - 如何访问 SQLite 表?
- android - 如何在 recyclerViewAdapter 中添加搜索功能