监视标准输出缓冲区并重定向到字符串C ++

时间:2016-12-23 11:56:21

标签: c++ stdout io-redirection

我有多个正在打印的.cpp文件,我想将其重定向到一个字符串。我的项目结构是:一个主文件,它从另一个文件和另一个文件调用函数。如果我有一个.cpp文件,使用stringstream很容易,但是如果有多个文件我该如何解决呢?

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

1 个答案:

答案 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);
}

使用多个线程时,您可能希望使用线程本地缓冲区来避免数据争用。被调用的函数会主动将缓冲区转移到需要的地方。