以下各项均采用独特的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之间的技术差异是什么?
答案 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之间的技术差异是什么?
他们做了完全不同的事情:
答案 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;
}