我正在阅读“ C ++食谱”,其中包含以下代码段:// cout << s << std::endl; // You shouldn't be able towcout << 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);获得接近预期的效果。在程序开始时。
3 回答
四季花海
TA贡献1811条经验 获得超5个赞
当cout
或wcout
称为首次,为定向stdout
成为集。在的情况下cout
,stdout
变为面向字节的流,在的情况下wcout
,stdout
变为面向宽字节的流。根据C ++标准[27.4.1]和C标准[7.19.2],一旦设置了流的方向,就不应调用与该流的方向不兼容的函数。
蛊毒传说
TA贡献1895条经验 获得超3个赞
从技术上讲,您绝对可以同时使用窄流和宽流。但是,除非您安排它们两个对字符进行相同的编码,否则结果很可能会混乱。不幸的是,这附带了一个警告,即您不能控制标准流对象使用的编码,至少不能移植。即使编码是相同的,也需要确保部分字符被完全写入,即,当切换到其他宽度时,至少需要刷新缓冲区。
- 3 回答
- 0 关注
- 904 浏览
添加回答
举报
0/150
提交
取消