我正在阅读"C++ Cookbook“,其中包含以下代码片段:
// 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。
发布于 2012-01-21 05:33:08
从技术上讲,你绝对可以同时使用窄流和宽流。但是,除非您安排它们对字符进行相同的编码,否则结果很可能是混乱的。不幸的是,这伴随着一个警告,那就是你不能控制标准流对象使用的编码,至少不能移植。即使编码是相同的,你也需要确保部分字符是完全写入的,也就是说,当切换到其他宽度时,至少需要刷新缓冲区。
https://stackoverflow.com/questions/8947949
复制相似问题