2016-09-11 6 views
1

내 프로젝트 (Unreal Engine 4)에서 출력 스트림이 없습니다. 대신 UE_LOG 함수를 통해 통신 할 수 있습니다. 이는 printf()과 매우 유사합니다 . 문제는 방금 iostream을 통해 통신하고 싶은 .dll 라이브러리 (Unreal 인클루드가 포함되지 않은 라이브러리)를 만들었다는 것입니다. 내 생각은 - 내부 .dll 라이브러리입니다. 표준 cout을 사용하여 ostream에 메시지를 쓰고, 언리얼 엔진 함수에서이 모든 것을 사용합니다. 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 라이브러리 내부 I 당신은 실제로 자신의 구현 std::cout에 사용되는 출력 버퍼를 대체 할 수 ostream에

에 메시지를 작성하는 표준 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 함수를 오버로드하는 것입니다. printf와 같이 작동합니다. –

+0

@CheshireCat _ "내가해야 할 한가지는'std :: ostringstream :: flush' 함수를 오버로드하는 것입니다."_ 자신이 구현 한 것에서 과부하된다면 [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()를 다운 캐스팅하는 sync() 메소드를 가진 자식 클래스의 버퍼를 만들었다. 이것을 제외하고는 일반적인 버퍼처럼 작동하며 모든 콘솔 출력 스트림을 잡아냅니다. 정확히 우리가 원했던 것입니다. 내부의 str ("")은 버퍼를 청소하는 것입니다. 아마도 출력 된 스트림 자체가 정리되지 않습니다.

도움 주셔서 감사합니다. 너를위한 큰 잔치! : D