我的代码:
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
与其他挑剔代码的接口需要奇怪的格式化。
答案 0 :(得分:8)
你应该这样做:
file1 << std::fixed << std::setprecision(2) << thePoint[1] << " ";
file1.unsetf(ios_base::fixed);
file1 << std::setprecision(16) << thePoint[2];
floatfield
格式标志可以采用其两个可能值中的任意一个(使用操纵器fixed
和scientific
),或者不使用任何值(使用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
等也不是很好的做法。
直。更好的解决方案是定义自己的操纵器,
名称为pression
或volume
,并使用这些名称。这是合乎逻辑的
标记,并表示您控制格式,例如从一个人的压力
中心位置,而不是在整个计划中传播。
如果你编写自己的操纵器,它相对容易
它们在完整结束时恢复原始格式参数
表达。 (操纵者对象将是临时的,被毁坏了
完整表达的结束。)