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

std::cout formatting in Cpp 98 standard

以下各项均与众不同的ostream格式有关。如何将其恢复为默认值?

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int main()
{
    std::cout << std::fixed;
    std::cout << std::setprecision(5) << f << '\
'
;
    std::cout <<"scientific:\
"
<< std::scientific;
    /*Cpp 11 standard only*/
    std::cout <<" hexfloat:" << std::hexfloat << 0.01 << '\
'
;
   "The number 0.01 in default:" << std::defaultfloat << 0.01; }
}

如:

1
std::set_default?;

我该如何执行

1
hexfloat and defaultfloat

在Cpp 98标准中吗?

setwidth和setprecision之间的技术区别是什么?


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

1
2
3
4
5
6
7
int main() {
    std::ostream restore(0);

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

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

1
2
3
4
5
6
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;
}

它将与其他任何操纵器一样使用,例如:

1
std::cout << set_default;

您只能使用一个流来恢复原始值。另外,您可以保持std::cout的格式不变,而是使用相同的缓冲区但使用不同的格式(例如

)来创建单独的流

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

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

1
2
3
4
std::cout <<"value=";
out << value;
std::cout << '\
'
;

回答有关例如defaultfloat行为的问题:这些只是操纵器函数。如果要在不使用C 11的情况下使用它们,则只需定义相应的函数即可,例如:

1
2
3
4
5
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;
}


互斥选项std::fixedstd::scientificstd::hexfloatstd::defaultfloat的默认值是std::defaultfloat

std::setprecision的默认值为6

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

std::defaultfloat替换C-pre 11很容易:

1
2
3
4
std::ios_base& defaultfloat(std::ios_base& str) {
    str.unsetf(std::ios_base::floatfield);
    return str;
}

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


How do I return if to default

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 << '\
'
;
std::cout <<"scientific:\
"
<< std::scientific;
/*Cpp 11 standard only*/
std::cout <<" hexfloat:" << std::hexfloat << 0.01 << '\
'
;
"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);

屁股有点疼。

Also how do I perform hexfloat and defaultfloat in Cpp 98 standard?

自己编写类似的函数。臀部的疼痛甚至更大。

what is the technical difference between setwidth and setprecision?

他们做的事情完全不同:

  • width-字段宽度确定在某些输出表示形式中要写入的最小字符数。如果表示形式的标准宽度短于字段宽度,则在由格式标志AdjustField(左,右或内部之一)确定的点上用填充字符填充表示形式。
  • precision-浮点精度决定要在插入操作中写入的最大位数,以表示浮点值。如何解释这取决于将floatfield格式标志设置为特定的表示法(固定的还是科学的)还是未设置(使用默认的表示法,它不一定等同于固定的或科学的)。对于默认语言环境:

    • 使用默认的浮点表示法,精度字段指定要计算的总有效位数,该总数将对小数点之前和之后的小数点总数进行计数。请注意,这不是最小值,因此,如果显示的数字位数少于精度,则不会在显示的数字后缀零。
    • 在固定和科学记数法中,精度字段都精确指定要在小数点后显示多少个数字,即使该数字包括尾随的十进制零也是如此。在这种情况下,小数点前的数字与精度无关。