我有以下工作代码,它使用ofstream生成格式化输出,但我觉得所有重复的格式说明符都难以阅读。有没有办法为给定的流永久设置精度,宽度和对齐方式,这样可以很好地清理它?
#include <fstream>
#include <iomanip>
ofstream myfile;
myfile.open(Output.c_str(), ios::trunc);
for (int i = 0; i < iLen; i++) {
myfile <<std::fixed << std::setw( iWidth ) << std::setprecision( iDecimals )<< std::right << pDist[i] << " "
<<std::fixed << std::setw( iWidth ) << std::setprecision( iDecimals )<< std::right << pRes[i] << " "
<<std::fixed << std::setw( iWidth ) << std::setprecision( iDecimals )<< std::right << pPhase[i] << "\n";
}
myfile.close();
答案 0 :(得分:4)
std::fixed
,std::setprecision
和std::right
都是“永久性的”。他们在流对象上设置了持久标志。
每次只需要放一个setw
,(据我所知)没有在流对象上设置标志,只需添加一定数量的空白通过改变流本身。但它只留下了流。
这类似于endl
,它在流上运行,但只留下实际的流对象。
This answer关于类似问题的详细信息,正如他们所说的那样,说明者是“粘性的”(以及为什么)。
编辑:清除了流对象与实际流之间的区别
答案 1 :(得分:2)
您需要担心的唯一操纵者是std::setw
,因为只要调用operator<<
,宽度就会设置为零。在循环之前,您可以设置&#34;永久性&#34; ios标志:
myfile << std::fixed << std::setprecision(iDecimals) << std::right;
for (int i = 0; i < iLen; i++) {
myfile << std::setw( iWidth ) << pDist[i] << " "
<< std::setw( iWidth ) << pRes[i] << " "
<< std::setw( iWidth ) << pPhase[i] << "\n";
}
如果您想一次取消设置这些标志,可以使用:
std::cout.copyfmt(std::ios(NULL));
如此answer中所述。