我想将一些printf
/sprintf
/fprintf
语句重构为ostream
/sstream
/fstream
语句。代码中涉及了对整数和浮点数的格式化输出,包括使用空格填充和设置小数点位数。
我认为这个重构可以采用 Martin Fowler 风格的安全、逐步重构方法来完成,并注明重要注意事项。当然,第一步是将旧代码放到测试环境中,我已经完成了这一步。
我可以采取哪些缓慢而谨慎的步骤来执行此重构?
我想将一些printf
/sprintf
/fprintf
语句重构为ostream
/sstream
/fstream
语句。代码中涉及了对整数和浮点数的格式化输出,包括使用空格填充和设置小数点位数。
我认为这个重构可以采用 Martin Fowler 风格的安全、逐步重构方法来完成,并注明重要注意事项。当然,第一步是将旧代码放到测试环境中,我已经完成了这一步。
我可以采取哪些缓慢而谨慎的步骤来执行此重构?
printf
的接口,但是具有类型安全性并在内部使用IOStreams。转换的基本机制:
printf
风格子句%w.pf
或%w.pe
,其中w
是字段宽度,p
是精度位数,转换为<< setw(w) << setprecision(p) << fixed
。printf
风格子句%wd
或%wi
,其中w
是字段宽度,转换为<< setw(w)
。"\n"
转换为endl
。printf
的处理过程:
char[]
(我们称之为text
)。printf(...)
转换为sprintf(text, ...)
,并使用cout << text
来实际打印文本。fprintf
的处理过程:
sprintf
的处理过程:
stringstream
,并将要写入的char[]
内容流式传输到其中。如果您仍然打算从中提取char*
,则可以使用std::stringstream::str().c_str()
。常见指令:
*printf
和char[]
声明。"\n"
дњЭзХЩдЄЇ "\n"
гАВendl
жЫіеГПжШѓ "\n"
еРОиЈЯзЭА fflush
гАВ - Nemo
printf
的接口,但是是类型安全的,比如 tinyformat(https://github.com/c42f/tinyformat)? - vitaut