我想将一些printf//语句重构为sprintf//语句。有问题的代码使用空白填充和固定的小数点数漂亮地打印了一系列整数和浮点数。fprintfostreamsstreamfstream
在我看来,这将是 Martin Fowler 风格的安全、逐步重构的写作的一个很好的候选者,并指出了重要的陷阱。当然,第一步是将遗留代码放入测试工具中,我已经这样做了。
我可以采取哪些缓慢而谨慎的步骤来执行此重构?
我想将一些printf//语句重构为sprintf//语句。有问题的代码使用空白填充和固定的小数点数漂亮地打印了一系列整数和浮点数。fprintfostreamsstreamfstream
在我看来,这将是 Martin Fowler 风格的安全、逐步重构的写作的一个很好的候选者,并指出了重要的陷阱。当然,第一步是将遗留代码放入测试工具中,我已经这样做了。
我可以采取哪些缓慢而谨慎的步骤来执行此重构?
如果重构本身不是目标,您可以通过使用诸如tinyformat 之类的格式化库来完全避免它(嗯,几乎),它提供了一个类似于printf但类型安全的接口并在内部使用 IOStreams。
转换的基本机制:
printf-style 子句%w.pf或%w.pe,其中w是字段宽度和p精度位数,转换为<< setw(w) << setprecision(p) << fixed。printf-style 子句%wd或%wi(其中w是字段宽度)转换为<< setw(w)."\n"到endl适当的地方。处理printf:
char[](我们称之为)。textprintf(...)为sprintf(text, ...),并用于cout << text实际打印文本。处理fprintf:
处理sprintf:
stringstream并将char[]您正在写入的内容流式传输到其中。如果您仍打算从中提取 a char*,则可以执行std::stringstream::str().c_str().常用指令:
*printf和声明。char[]