2016-12-23 4 views
0

У меня есть несколько файлов .cpp, которые печатаются, и я хочу перенаправить это на строку. Структура моего проекта: основной файл, который вызывает функции из других файлов и других файлов. Если у меня есть один .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

Большое спасибо. Но он работает только в том случае, если у вас есть один .cpp-файл. Что делать, если у вас есть несколько файлов .cpp, которые распечатываются? –

+0

@ J.Devero Почему, по вашему мнению, это работает только для одного .cpp-файла? –

+0

Я попробовал его и содержит только то, что напечатано в main.cpp –

Смежные вопросы