[英]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::fixed
, std::scientific
, std::hexfloat
和std::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之间的技术区别是什么?
他们做的事情完全不同:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.