首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在同一程序中混合使用cout和wcout

在同一程序中混合使用cout和wcout
EN

Stack Overflow用户
提问于 2012-01-21 05:15:43
回答 4查看 7.9K关注 0票数 29

我正在阅读"C++ Cookbook“,其中包含以下代码片段:

代码语言:javascript
运行
复制
// cout  << s  << std::endl;  // You shouldn't be able to
wcout << ws << std::endl;     // run these at the same time

如果您对查看实际示例感兴趣,请参阅a link to the page on Google books

此外,我还发现了这个SO question,它似乎说明混合使用wcout和cout是可以的。有人能给我解释一下这条评论说的是什么吗?

编辑

来自C++标准27.4.1

在相应的宽字符流和窄字符流上的

混合操作遵循与在文件上混合这类操作相同的语义,如ISO C标准的修订版1中所指定的。

来自C标准7.19.2

每个流都有一个方向。在流与外部文件关联之后,但在对其执行任何操作之前,流是没有方向的。一旦将宽字符输入/输出功能应用于没有定向的流,该流就变成宽定向的流。类似地,一旦字节输入/输出函数被应用于没有定向的流,该流就变成面向字节的流。只有对freopen函数或fwide函数的调用才能改变流的方向。(对freopen的成功调用将移除所有方向。)

字节输入/输出函数不应应用于面向宽的流,宽字符输入/输出函数不应应用于面向字节的流。

所以,标准似乎是说你不应该把它们混合在一起。然而,我发现这句话是from this article

用于Visual C++ 10.0的

fwide函数在文档中记录为未实现。从实际的角度来看,至少在输出整行的级别上,混合使用cout和wcout显然是很好的。因此,令人高兴的是,Visual C++显然忽略了标准的要求,并且没有维护不切实际的显式C文件流方向。

另外,关于gcc,我在here上找到了这句话

这是一个(新的)特性,不是一个bug,参见libstdc++/11705和关于C标准(C99,7.19.2)中流方向的一般搜索。简而言之,您不能混合面向字节和面向宽的I/O。现在,由于libstdc++/11705中指出的错误,您可以通过在程序开始时调用std::ios::sync_with_stdio(false);来获得与您期望的更接近的I/O。

EN

Stack Overflow用户

发布于 2012-01-21 05:33:08

从技术上讲,你绝对可以同时使用窄流和宽流。但是,除非您安排它们对字符进行相同的编码,否则结果很可能是混乱的。不幸的是,这伴随着一个警告,那就是你不能控制标准流对象使用的编码,至少不能移植。即使编码是相同的,你也需要确保部分字符是完全写入的,也就是说,当切换到其他宽度时,至少需要刷新缓冲区。

票数 3
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8947949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档