在同一程序中混合cout和wcout

我正在阅读“ C ++食谱”,其中包含以下代码段:


// cout  << s  << std::endl;  // You shouldn't be able to

wcout << ws << std::endl;     // run these at the same time

如果您有兴趣查看实际示例,请访问以下指向Google图书页面的链接。


另外,我发现了这个SO问题,似乎表明将wcout和cout混合是可以的。有人可以向我解释此评论在说什么吗?


编辑


从C ++标准[27.4.1]:


相应的宽字符流和窄字符流的混合操作遵循与在FILEs上混合此类操作相同的语义,如ISO C标准的修订1所指定。


根据C标准[7.19.2]:


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


字节输入/输出功能不得应用于宽方向的流,而宽字符输入/输出功能不应适用于面向字节的流。


因此,该标准似乎表明您不应该将它们混合使用。但是,我从这篇文章中找到了这句话:


对于Visual C ++ 10.0,fwide函数记录为未实现。从实际的角度来看,至少在输出整行的水平上,显然可以将cout和wcout混合使用。因此,令人高兴的是,Visual C ++显然只是无视该标准的要求,而没有维护不切实际的显式C FILE流定向。


而且,关于gcc,我从这里找到了这句话:


这是一项(新)功能,而不是错误,请参阅libstdc ++ / 11705,以及有关C标准(C99,7.19.2)中流方向的一般信息。简而言之,您不能将面向字节的I / O和面向宽方向的I / O混合使用。现在,由于 libstdc ++ / 11705中指出的错误,您可以通过调用std :: ios :: sync_with_stdio(false);获得接近预期的效果。在程序开始时。


翻阅古今
浏览 905回答 3
3回答

四季花海

当cout或wcout称为首次,为定向stdout成为集。在的情况下cout,stdout变为面向字节的流,在的情况下wcout,stdout变为面向宽字节的流。根据C ++标准[27.4.1]和C标准[7.19.2],一旦设置了流的方向,就不应调用与该流的方向不兼容的函数。

蛊毒传说

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

当年话下

显然,每个对象都在“目标”流上添加了方向STDOUT,并且不允许在已添加方向[C++11: 27.4.1]和的流上混合操作[C99: 7.19.2]。
打开App,查看更多内容
随时随地看视频慕课网APP