如何删除格式化流中的冗余

时间:2014-10-28 16:43:21

标签: c++ c++98

我有以下工作代码,它使用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();

2 个答案:

答案 0 :(得分:4)

std::fixedstd::setprecisionstd::right都是“永久性的”。他们在流对象上设置了持久标志。

每次只需要放一个setw,(据我所知)没有在流对象上设置标志,只需添加一定数量的空白通过改变流本身。但它只留下了流。

这类似于endl,它在流上运行,但只留下实际的流对象。

@LokiAstari的

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中所述。