C ++延迟printf直到需要

在c ++中,是否可以用printf(或类似的东西)写入某种缓冲区,然后在程序中稍后根据结果将缓冲区写入屏幕或将其丢弃。

我之所以要这样做,是因为我有一个递归函数,并且只在结果令人感兴趣时才希望看到整个递归中打印的内容。


最佳答案:

当然。为此,您可以利用vsnprintf的功能。我建议某种包装std::stringstd::vector<char>的类(在C ++ 11中基本上相同):

#include <cstdargs>
#include <cstdio>
#include <string>

class Formatter
{
    std::string buf;
public:
    void add(char const * fmt, ...)
    {
        std::va_list ap, aq;
        va_start(ap, fmt);
        va_copy(aq, ap);

        int ret1 = std::vsnprintf(NULL, 0, fmt, ap);
        // check ret1 != -1

        std::size_t cur = buf.size();
        buf.resize(cur + ret1 + 1);

        int ret2 = std::vsnprintf(&buf[cur], ret1 + 1, fmt, aq);
        // check ret2 != -1
        buf.resize(cur + ret1);

        va_end(aq);
        va_end(ap);
    }

    std::string const & str() const { return buf; }
};


现在您可以说:

Formatter f;
f.add("Hello, %s", "world");
f.add("%i%i%i", 1, 2, 3);
std::cout << f.str() << std::endl;


如果您非常关注性能,则可以尝试为打印操作预分配一些空间,并保持单独的“结束”位置,以希望您不必多次运行vnsprintf调用。