std::ostream 忽略通过 setf() 在底层上设置的十六进制标志

std::ostream ignores hex flag set on the underlying via setf()

提问人:Isac Casapu 提问时间:2/6/2018 最后编辑:O'NeilIsac Casapu 更新时间:2/6/2018 访问量:303

问:

下面的 C++ 代码出人意料地产生了十进制输出,显然忽略了对 和 打印 的调用。使用 Gives same result.然而,使用确实给出了预期的输出,因此并且正在得到尊重。setf()true 42std::setiosflags()std::cout << std::hextrue 0x2astd::ios::showbasestd::ios::boolalpha

我已经在 Ubuntu 上测试了 G++ 5.4,在 CentOS 上测试了 G++ 7.2.1。我在这里错过了什么?

#include <sstream>
#include <iostream>
#include <iomanip> 
#include <iterator>

int main()
{

    std::cout.setf(std::ios::hex | std::ios::showbase | std::ios::boolalpha);
    // Uncommenting the line below doesn't make a difference.
    //std::cout << std::setiosflags(std::ios::hex | std::ios::showbase | std::ios::boolalpha);
    // Uncommenting this line does give the desired hex output.
    //std::cout << std::hex;

    int m = 42;
    std::cout << true << ' ' << m << std::endl;
    return 0;
}
C G++ IOstream IOManip

评论


答:

1赞 Mihayl 2/6/2018 #1

setf 的这种变体只添加标志,但您需要清除基本字段。

因此,您需要将重载与掩码一起使用:

    std::cout.setf(std::ios::hex | std::ios::showbase | std::ios::boolalpha,
                   std::ios_base::basefield | std::ios::showbase | std::ios::boolalpha);

输出:

真正的0x2a

Live Demo

评论

0赞 Isac Casapu 2/6/2018
谢谢!有没有办法清除所有字段,以便生成的标志与我设置的标志完全相同?
1赞 Mihayl 2/6/2018
使用您设置的所有内容制作一个掩码,并使用提供的掩码(如 、 等)作为它们包含的标志。如果您查看相应的输出操纵器并了解它们的作用,这同样会很有帮助 - en.cppreference.com/w/cpp/io/manip/hexbasefieldadjustfieldfloatfieldstd::hex