3

std :: coutをstringstreamsにリダイレクトすることに関するたくさんの投稿を読みましたが、リダイレクトされた文字列の読み取りに問題があります。

std::stringstream redirectStream;
std::cout.rdbuf( redirectStream.rdbuf() );

std::cout << "Hello1\n";
std::cout << "Hello2\n";

while(std::getline(redirectStream, str))
{
  // This does not work - as the contents of redirectStream 
  // do not include the '\n' - I only see "Hello1Hello2"
}

最初の出力内の新しい行を選択する必要があります-それを行う方法について誰かが私に教えてもらえますか?

ありがとう。

4

2 に答える 2

3

私にとっては問題なく動作します:
注:std :: getline()は行を読み取ります(ただし、'\ n'文字ではなく、各行が読み取られた後、行ターミネーターは破棄されます)。ただし、ループは行ごとに1回入力されます。

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream   redirectStream;
    std::streambuf*     oldbuf  = std::cout.rdbuf( redirectStream.rdbuf() );

    std::cout << "Hello1\n";
    std::cout << "Hello2\n";

    std::string str;
    while(std::getline(redirectStream, str))
    {
        fprintf(stdout,"Line: %s\n",str.c_str());
        // loop enter once for each line.
        // Note: str does not include the '\n' character.
    }

    // In real life use RAII to do this. Simplified here for code clarity.
    std::cout.rdbuf(oldbuf);
}

注:古いstream-bufferをstd::coutに戻す必要があります。stringstream'redirectStream'がスコープ外になると、そのバッファは破棄され、std::coutが無効なストリームバッファを指します。std ::coutは'redirectStream'よりも長持ちするため、std::coutが無効なオブジェクトにアクセスしないようにする必要があります。したがって、最も簡単な解決策は、古いバッファを元に戻すことです。

于 2009-12-10T16:08:18.757 に答える
0

返信ありがとうございます。自分が間違ったことを見ることができます。問題を単純化するために多くのコードを削除したので、はい、実際に動作するバージョンを投稿しました!私の実際の論理が問題だったようです:

// Basically... 
std::string str; 
std::stringstream redirectstream; 
// perform the redirection... 
// ... 

while (!done)
{ 
  while(std::getline(redirectStream, str)) 
  { 
    // stuff... 
  } 
  std::cout << "Hello1\n"; 
  std::cout << "Hello2\n"; 
} 

この状況では、getline()関数は無効になっているようです。これを説明してもらえますか?

これは今ではまったく別の問題であることに気づき、最初の投稿が悪いと誤解を招くことをお詫びします。

于 2009-12-10T17:17:32.207 に答える