C ++ 98标准中的std :: cout格式

时间:2015-01-27 23:34:38

标签: c++ c++11 hex iostream fixed

以下各项均采用独特的ostream格式。如何将其恢复为默认值?

#include <iostream>
int main()
{
    std::cout << std::fixed;
    std::cout << std::setprecision(5) << f << '\n';
    std::cout << "scientific:\n" << std::scientific;
    /*Cpp 11 standard only*/
    std::cout << " hexfloat: " << std::hexfloat << 0.01 << '\n';
    "The number 0.01 in default: " << std::defaultfloat << 0.01; }
}

如:

std::set_default?;

另外我该怎么做

hexfloat and defaultfloat

在Cpp 98标准中?

setwidth和setprecision之间的技术差异是什么?

3 个答案:

答案 0 :(得分:2)

互斥选项std::fixed, std::scientific, std::hexfloat and std::defaultfloat的默认设置是,您得到了std::defaultfloat

std::setprecision的默认值为6

必须分别为每个流插入器查找std::setw的确切效果。

替换std::defaultfloat前C ++ 11很容易:

std::ios_base& defaultfloat(std::ios_base& str) {
    str.unsetf(std::ios_base::floatfield);
    return str;
}

std::hexfloat同样容易,但是流操作员不知道如何处理这些标志。
这是非常重要的修复。

答案 1 :(得分:1)

  

如何返回默认值

auto oldflags = std::cout.flags(); 
auto oldwidth = std::cout.width(); 
auto oldprecision = std::cout.precision();
auto oldloc = std::cout.getloc();
auto oldfill = std::cout.fill();
//**************************************************
std::cout << std::fixed;
std::cout << std::setprecision(5) << f << '\n';
std::cout << "scientific:\n" << std::scientific;
/*Cpp 11 standard only*/
std::cout << " hexfloat: " << std::hexfloat << 0.01 << '\n';
"The number 0.01 in default: " << std::defaultfloat << 0.01; 
//**********************************************************
std::cout.flags(oldflags); 
std::cout.width(oldwidth); 
std::cout.precision(oldprecision);
std::cout.imbue(oldloc);
std::cout.fill(oldfill);

这是一种痛苦的屁股。

  

另外,如何在Cpp 98标准中执行hexfloat和defaultfloat?

自己编写类似的功能。它更像是一个痛苦的屁股。

  

setwidth和setprecision之间的技术差异是什么?

他们做了完全不同的事情:

  • width - 字段宽度确定要在某些输出表示中写入的最小字符数。如果表示的标准宽度小于字段宽度,则在格式标志adjustfield(左,右或内部之一)确定的点处用填充字符填充表示。
  • precision - 浮点精度确定在插入操作上写入的最大位数,以表示浮点值。如何解释这取决于floatfield格式标志是否设置为特定符号(固定或科学)或未设置(使用默认表示法,不一定等同于固定或科学)。对于默认语言环境:
    • 使用默认浮点表示法,精度字段指定要显示的有意义数字的最大数量,以计算小数点前和小数点后的总数。请注意,它不是最小值,因此如果数字的显示位数少于精度,则不会使用尾随零填充显示的数字。
    • 在固定和科学记数法中,精确字段指定在小数点后显示的确切位数,即使这包括尾随小数零。在这种情况下,小数点前的数字与精度无关。

答案 2 :(得分:1)

恢复原始格式的简单方法是保持流无需任何修改,只需使用copyfmt(),例如:

int main() {
    std::ostream restore(0);

    restore.copyfmt(std::cout);
    std::cout.precision(8);
    std::cout.copyfmt(restore);
}

此方法将恢复所有不同格式,包括pword()iword()存储的值。如果要将此功能打包为set_default操纵器(不能将其放入命名空间std,因为只允许实现者在其中放置名称),您可以使用以下内容:< / p>

template <typename cT, typemame Traits>
std::basic_ostream<cT, Traits>& set_default(std::basic_ostream<cT, Traits>& out) {
    static std::basic_ostream<cT, Traits> dfault(0);
    out.copyfmt(dfault);
    return out;
}

它可以像任何其他操纵器一样使用,例如:

std::cout << set_default;

您可以只有一个流来恢复原始值。或者,您可以保持std::cout的格式完整,而是使用相同的缓冲区但不同的格式创建单独的流,例如

std::ostream out(std::cout.rdbuf());
out.precision(8);
out << value;

此流将写入与std::cout相同的流,但使用不同的格式标记。您甚至可以混合它们,因为流不直接存储任何字符:这是共享流缓冲区的作用:

std::cout << "value=";
out << value;
std::cout << '\n';

要回答关于行为的问题,例如defaultfloat:这些只是操纵函数。如果你想在没有C ++ 11的情况下使用它们,你可以定义一个相应的函数,例如:

template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& defaultfloat(std::basic_ostream<cT, Traits>& out) {
    out.unsetf(std::ios_base::floatfield);
    return out;
}