如何关闭std :: fixed并返回默认的C ++设置

时间:2012-08-23 15:17:36

标签: c++

我的代码:

std::vector<double> thePoint(4);
thePoint[0] = 86;
thePoint[1] = -334.8836574; 
thePoint[2] = 24.283;
thePoint[3] = 345.67675;

ofstream file1(tempFileName, ios::trunc);
file1 << std::setprecision(16)              << thePoint[0] << " ";
file1 << std::fixed << std::setprecision(2) << thePoint[1] << " ";
file1 << std::setprecision(16)              << thePoint[2] << " ";
file1 << std::setprecision(16)              << thePoint[3];

我明白了:

86 -334.88 24.28300000000000 345.6767500000000

我想:

86 -334.88 24.283 345.67675

与其他挑剔代码的接口需要奇怪的格式化。

2 个答案:

答案 0 :(得分:8)

你应该这样做:

file1 << std::fixed << std::setprecision(2) << thePoint[1] << " ";
file1.unsetf(ios_base::fixed);
file1 << std::setprecision(16)              << thePoint[2];

floatfield格式标志可以采用其两个可能值中的任意一个(使用操纵器fixedscientific),或者不使用任何值(使用ios_base::unsetf)。< / p>

答案 1 :(得分:5)

您可以通过将floatfield强制为空值来实现:

file1.setf( std::ios_base::fmtflags(), std::floatfield );

然而,在实践中,它很少需要。通常的协议是 保存格式标志,并在通过时恢复它们:

std::ios_base::fmtflags originalFlags = file1.flags();
//  ...
file1.flags( originalFlags );

当然,您通常使用RAII在真实程序中执行此操作。您 应该在工具箱中有一个IOSave类来保存标志, 构造函数中的精度和填充字符,并进行恢复 他们在析构函数中。

使用std::setprection等也不是很好的做法。 直。更好的解决方案是定义自己的操纵器, 名称为pressionvolume,并使用这些名称。这是合乎逻辑的 标记,并表示您控制格式,例如从一个人的压力 中心位置,而不是在整个计划中传播。 如果你编写自己的操纵器,它相对容易 它们在完整结束时恢复原始格式参数 表达。 (操纵者对象将是临时的,被毁坏了 完整表达的结束。)