我想将一些printf
/ sprintf
/ fprintf
条句重构为ostream
/ sstream
/ fstream
条款。有问题的代码使用空格填充和固定的小数点数来打印一系列整数和浮点数。
在我看来,这将是Martin Fowler风格的安全,逐步重构的一个很好的候选人,并注意到重要的问题。当然,第一步是将遗留代码放入测试工具中,我已经完成了。
我可以采取哪些缓慢而谨慎的步骤来执行此重构?
答案 0 :(得分:2)
如果重构本身不是目标,那么你可以通过使用tinyformat之类的格式库来完全避免它(好吧,差不多),它提供类似于printf
的接口,但是类型安全且在内部使用IOStreams。
答案 1 :(得分:2)
转换的基本机制:
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
的处理:
printf
相同,但请使用相应的fstream
代替cout
。
FILE
对象,此时您不想重构,它会有一点sticky(但是can be done)。 sprintf
的处理:
stringstream
并将您正在写入的char[]
的内容流式传输到该内容中。如果您仍打算从中提取char*
,则可以执行std::stringstream::str().c_str()
。常用说明:
*printf
和char[]
声明。