1

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

我想这样做是因为我有一个递归函数,并且只希望在结果感兴趣的情况下查看整个递归过程中打印的内容。

4

5 回答 5

4

该课程std::ostringstream是您正在寻找的。

在 C++ 中,格式化 IO 是(最好)通过<iostream>库完成的。这就是大名鼎鼎的cout << variable << endl

cout直接输出到标准输出。如果您想改为缓冲,您可以将输出重定向到一个std::ostringstream实例,然后您可以将其重定向到标准输出:

#include <iostream>

[...]


ostringstream buf;
buf << myVar1 << "MyStr" << endl;

[...] // some time later

cout << buf.str();

如果你更喜欢printf做事的方式,你可以使用sprintf(虽然我不会推荐它)。它有点复杂,因为您需要提前知道缓冲区的大小。

char myBuf[10000]; // up to you do to the proper bound checking
sprintf(myBuf, "format %d", myvar);

[...] // you may want to use strcat and such for more complex operations

printf(myBuf);
于 2012-09-03T12:18:54.490 回答
1

当然。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调用。

于 2012-09-03T12:21:53.433 回答
0

使用字符串是什么意思?或者一个字符串数组。还是收藏?收集您需要的所有数据并在需要时打印?

于 2012-09-03T12:13:49.003 回答
0

您可以使用与char 缓冲区sprintf执行相同操作的函数。printf但你不应该。这些旧的 C 风格函数在 C++ 中已经过时,您应该使用流来代替。看起来std::stringstream适合你需要。

于 2012-09-03T12:19:01.730 回答
0

对于递归函数,最好的方法是延迟获取结果,而不是打印它,所以不要这样:

int fact( int n )
{
    printf("%d", n);
    if( n!=1 )
        return n * fact(n - 1);
    else return 1;
};
<....>
fact( 5 );

你可以使用这个:

int fact( int n )
{
    if( n!=1 )
        return n * fact(n - 1);
    else return 1;
};
<....>
int result = fact( 5 );
printf("%d", result);

基本上,只有在它准备好时才打印它。如果由于某些原因您不能直接执行此操作,请将结果保存到某种缓冲区变量中,并在函数结束后访问它。

于 2012-09-03T12:20:04.037 回答