【问题标题】:Mixing std::wcout and std::cout makes errors, what is wrong? [duplicate]混合 std::wcout 和 std::cout 会出错,有什么问题? [复制]
【发布时间】:2019-09-21 08:35:46
【问题描述】:

使用 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;
}

【问题讨论】:

  • 好的,谢谢你的链接!

标签: c++ cout widechar


【解决方案1】:

引用this page

程序不应将 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;
}

但避免混合它们可能更简单。

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多