相关疑难解决方法(0)

在同一个程序中混合cout和wcout

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

// cout  << s  << std::endl;  // You shouldn't be able to
wcout << ws << std::endl;     // run these at the same time
Run Code Online (Sandbox Code Playgroud)

如果您对查看实际示例感兴趣,可以在此处找到Google图书页面的链接.

此外,我发现这个SO问题似乎表明混合wcout和cout是可以的.有人可以向我解释一下这个评论的内容吗?

编辑

从C++标准[27.4.1]:

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

从C标准[7.19.2]:

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

字节输入/输出功能不应用于面向广泛的流,宽字符输入/输出功能不应用于面向字节的流.

所以,标准似乎说你不应该混合它们.但是,我从这篇文章中找到了这句话:

对于Visual C++ 10.0,fwide函数被记录为未实现.从实际的角度来看,至少在输出整行的水平上,它显然可以很好地混合使用cout和wcout.因此,很高兴,Visual C++显然只是忽视了标准的要求,并没有维护一个不切实际的显式C FILE流方向.

而且,关于gcc,我从这里找到了这个引用:

这是一个(新的)功能,而不是一个bug,请参阅libstdc ++/11705,以及在C标准(C99,7.19)中的流方向搜索.简而言之,您不能混合面向字节和面向广泛的I/O. 目前,由于 libstdc ++/11705中指出的bug,你可以通过调用std :: ios :: sync_with_stdio(false)获得接近你期望的东西.在你的程序的开头.

c++

25
推荐指数
1
解决办法
6614
查看次数

标签 统计

c++ ×1