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

How to remove redundancy in formatted ofstream

本文关键字:冗余 格式化 何删除 删除      更新时间:2023-10-16

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

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

每次只需要放一个setw,(据我所知)它不会在流对象上设置标志,只是通过更改流本身来添加一定量的空白。但它让溪流独处。

这类似于endl,它对流进行操作,但不涉及实际的流对象。

@LokiAstari对一个类似问题的回答详细说明了他们所说的哪些说明符是"粘性的"(以及为什么)。

编辑:清除流对象和实际流之间的区别

您唯一需要担心的操纵器是std::setw,因为每当调用operator<<时,宽度都会设置回零。在循环之前,您可以设置"永久"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));

如本答复所述。