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::stringorをラップするある種のクラスをお勧めします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 に答える