繁体   English   中英

Cpp 98标准中的std :: cout格式

[英]std::cout formatting in Cpp 98 standard

以下各项均与众不同的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之间的技术区别是什么?

互斥选项std::fixedstd::scientificstd::hexfloatstd::defaultfloat值为std::defaultfloat

std::setprecision的默认值为6

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

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

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

编写std::hexfloat同样容易,但是流操作符将不知道如何处理这些标志。
修复起来很简单。

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

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

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

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

template <typename cT, typename 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;
}

如何返回默认值

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(左,右或内部之一)确定的点上用填充字符填充表示形式。
  • 精度-浮点精度确定要在插入操作中写入以表示浮点值的最大位数。 如何解释这取决于将floatfield格式标志设置为特定的表示法(固定的还是科学的)还是未设置(使用默认的表示法,它不一定等同于固定的或科学的)。 对于默认语言环境:
    • 使用默认的浮点表示法,精度字段指定要显示的总有效位数 ,该总数将对小数点之前和之后的小数进行总计。 请注意,这不是最小值,因此,如果显示的数字位数少于精度,则不会在显示的数字后缀零。
    • 在固定和科学记数法中,精度字段都精确指定要在小数点后显示多少个数字 ,即使其中包括尾随的十进制零也是如此。 在这种情况下,小数点前的数字与精度无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM