2016-12-23 14 views
0

複数の.cppファイルが出力されており、これを文字列にリダイレクトしたい。私のプロジェクトの構造は:別のファイルと別のファイルから関数を呼び出すメインファイルです。 1つの.cppファイルがある場合は、stringstreamで簡単ですが、複数のファイルがある場合、どのように解決できますか?標準出力バッファの監視と文字列へのリダイレクトC++

MAIN.CPP:

#include "Second.h" 

int main() { 
    std::string buffer = "First line"; 
    printOut(buffer); 
    std::cout << "Hello world" << std::endl; 
} 

Second.h:

#include <string> 

void printOut(std::string buffer); 

Second.cpp

#include "Second.h" 

void printOut(std::string buffer) { 
    std::cout << buffer << std::endl; 
} 

文字列は次のようになります。この場合:

redirectedString = First line\nHello World\n 
+0

「どうやって動作しないか」を追加してください。 – malarzm

+5

何をしようとしていても、これは完全に間違った方法です。本当の問題は何を解決しようとしているのですか?いいえ、あなたがここで求めているのではなく、これが解決策だと思う本当の問題です。 –

+0

本当の問題は、何かが出力バッファにあるかどうかをチェックする方法とそこから取得する方法を知らないことです。 –

答えて

1

標準ストリームへの出力は、適切なストリームバッファを使用して傍受することができます。例:

void do_something_with(std::string const& s) { 
    // ... 
} 

struct basicbuf: std::streambuf { 
    std::string buf; 
    int_type overflow(int_type c) { 
     if (c != traits_type::eof()) { 
      this->buf.push_back(c); 
     } 
     return traits_type::not_eof(c); 
    } 
    int sync() { 
     do_something_with(buf); 
     buf.clear(); 
     return 0; 
    } 
}; 

int main() { 
    basicbuf buf; 
    std::streambuf* orig = std::cout.rdbuf(&buf); 

    std::cout << "hello, world\n" << std::flush; 
    std::cout.rdbuf(orig); 
} 

複数のスレッドを使用する場合は、スレッド競合が発生しないようにスレッドローカルバッファを使用することができます。呼び出される関数は、バッファが必要な場所に積極的に転送されます。

+0

ありがとうございました。しかし、1つの.cppファイルがある場合にのみ機能します。プリントアウトしている.cppファイルが複数ある場合はどうなりますか? –

+0

@ J.Deveroなぜ1つの.cppファイルに対してのみ動作すると思いますか? –

+0

私はそれを試して、main.cppに印刷されているものだけを含んでいます。 –

関連する問題