std::cout formatting in Cpp 98 standard
以下各项均与众不同的
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之间的技术区别是什么?
恢复原始格式的简单方法是保持流不作任何修改,仅使用
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); } |
此方法将恢复所有不同的格式,包括用
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; |
您只能使用一个流来恢复原始值。另外,您可以保持
)来创建单独的流
1 2 3 | std::ostream out(std::cout.rdbuf()); out.precision(8); out << value; |
此流将与
1 2 3 4 | std::cout <<"value="; out << value; std::cout << '\ '; |
回答有关例如
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; } |
互斥选项
必须分别为每个流插入者查找
用
1 2 3 4 | std::ios_base& defaultfloat(std::ios_base& str) { str.unsetf(std::ios_base::floatfield); return str; } |
编写
修复起来很简单。
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格式标志设置为特定的表示法(固定的还是科学的)还是未设置(使用默认的表示法,它不一定等同于固定的或科学的)。对于默认语言环境:
- 使用默认的浮点表示法,精度字段指定要计算的总有效位数,该总数将对小数点之前和之后的小数点总数进行计数。请注意,这不是最小值,因此,如果显示的数字位数少于精度,则不会在显示的数字后缀零。
- 在固定和科学记数法中,精度字段都精确指定要在小数点后显示多少个数字,即使该数字包括尾随的十进制零也是如此。在这种情况下,小数点前的数字与精度无关。