在c++中,是否可以用printf(或类似的东西)写入某种缓冲区,然后在程序中稍后根据结果将缓冲区写入屏幕或将其丢弃。
我之所以要这样做,是因为我有一个递归函数,并且如果结果令人感兴趣,则只希望查看在整个递归中打印的内容。
最佳答案
当然。为此,您可以利用vsnprintf
的功能。我建议包装std::string
或std::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
调用。关于c++ - C++延迟printf直到需要,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12247646/