2016-09-11 4 views
1

В моем проекте (Unreal Engine 4) у меня нет потока вывода - вместо этого я могу общаться через функцию UE_LOG, которая работает почти так же, как printf() , Проблема в том, что я просто создал библиотеку .dll (без Unreal), с которой я хочу общаться через iostream. Моя идея - внутри библиотеки .dll Я использую стандартный cout для записи сообщений в ostream, я использую все это в функциях Unreal Engine, где я захватываю ostream в виде строки и вывожу ее в функцию UE_LOG.std :: cout, ostream и другие виды получения выходного потока

Проблема в том, что я всегда рассматривал std::cout как часть магии, не думая, что на самом деле внутри (я уверен, что большинство из нас). Как я могу справиться с этим? Простые способы не будут работать (например, захват stringstream и вывод его в UE_LOG).

+0

Оберните этот материал в соответствии с синтаксисом 'std :: ostream'. BIG GRIN: D –

+0

Зачем пропускать потоки, когда вы можете просто передать строки? Пусть функции в DLL принимают аргументы 'std :: string', и если им нужно вернуть строку, верните строку' std :: string'. –

+0

@ joachim-pileborg Да, но функция dll может сделать сложный процесс, и ему придется вызывать до и после выполнения - так что просто захват строки не поможет. –

ответ

2

Моя идея - внутри DLL-библиотеки я использую стандартный COUT писать сообщения в ostream

Вы на самом деле можете заменить выходной буфер, используемый с std::cout с собственной реализацией. Используйте функцию std::ostream::rdbuf(), чтобы сделать это (например, от исходной документации):

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::ostringstream local; 
    auto cout_buff = std::cout.rdbuf(); // save pointer to std::cout buffer 

    std::cout.rdbuf(local.rdbuf()); // substitute internal std::cout buffer with 
     // buffer of 'local' object 

    // now std::cout work with 'local' buffer 
    // you don't see this message 
    std::cout << "some message"; 

    // go back to old buffer 
    std::cout.rdbuf(cout_buff); 

    // you will see this message 
    std::cout << "back to default buffer\n"; 

    // print 'local' content 
    std::cout << "local content: " << local.str() << "\n"; 
} 
+0

Я не знаю, как сделать local.rdbuf. Помните, у меня есть функция с формой printf. Только вещи, которые я могу передать, - это c_strings, целые числа и т. Д. –

+0

Идея очень хорошая, но мне нужно только одно: перегрузить функцию std :: ostringstream :: flush (или что-то еще, что может привести к потере вещей на терминале), чтобы автоматически записывать вещи в мою консоль вывода (вы знаете, UE_LOG, которая работает как printf). –

+0

@CheshireCat _ «Мне нужно идти, чтобы перегрузить' std :: ostringstream :: flush' function »_ Если вы перегружаетесь из своей собственной реализации, я думаю, [' std :: basic_streambuf :: sync() '] (http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsync) несут ответственность за это. –

1

(в случае, если моя править не будет положительно рассмотрен)

От OP: Благодаря вашим намекам я наконец-то нашел, как решить мою проблему. Предположим, я хочу получить поток из cout и отправить его в printf (потому что я думаю, что библиотека stdio превосходит iostream). Вот как я могу это сделать:

#include <iostream> 
#include <sstream> 
#include <cstdio> 

using namespace std; 

class ssbuf : public stringbuf{ 
protected: 
    int sync(){ 
     printf("My buffer: %s",this->str().c_str()); 
     str(""); 
     return this->stringbuf::sync(); 
    } 
}; 


int main(){ 
    ssbuf *buf = new ssbuf(); 
    cout.rdbuf(buf); 
    cout<<"This is out stream "<<"and you cant do anything about it"<<endl; 
    cout<<"(don't) "<<"Vote Trump"<<endl; 
} 

Код очень сырой, но он выполняет свою работу. Я создал дочерний класс буфера, который имеет метод sync() downcasting original virtual method sync(). Кроме этого он работает как обычный буфер, просто захватывает весь консольный поток - именно то, что мы хотели. Строка ("") внутри - очистка буфера - возможно, не выводимый поток не очищает себя.

Большое спасибо за помощь! Большая GRIN для вас! : D

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