2017-12-18 21 views
2

Qt 콘솔 응용 프로그램이 있습니다.Qt 콘솔 : 모든 stdin 및 stdout을 파일로 저장하십시오.

QTextStream in(stdin); 
QTextStream out(stdout); 

가 지금은 파일에 전체 세션을 기록 할,하지만 난 스트림을 사용하는 모든 위치에서 로그 출력을 추가하지 않으 : 사용자와의 모든 통신은 두 개의 스트림을 통해 이동합니다.

두 스트림의 데이터를 콘솔과 파일에 "tee"하는 쉬운 방법이 있습니까?

앱이 Windows에서 실행되어야합니다.

+4

예, 스트림을 "tee"로하여 표준 입력/표준 출력 ** 대신 QTextStream에 제공하는 std :: streambuf에서 상속 한 클래스를 생성 할 수 있습니다. [간단한 하우투] (http : /wordaligned.org/articles/cpp-streambufs)는 실제로 "C++ tee streambuf"에 대한 Google의 첫 번째 Google 결과입니다. – user1810087

답변

1

매우 간단한 해결책을 제안하지만 C++ 14을 권장합니다. 나는 QTextStream이 방법 (단지 예로서 출력) 포장 것이다 :

#include <QTextStream> 
#include <QFile> 

class OutTeeTextStream 
{ 
public: 
    OutTeeTextStream() 
    { 
     logfilestream = 0; 
     stdoutstream = new QTextStream(stdout); 
     file.setFileName("/tmp/outlog.log"); 
     if(file.open(QFile::Append)) 
     { 
      logfilestream = new QTextStream(&file); 
     } 
    } 
    ~OutTeeTextStream() 
    { 
     file.close(); 
     delete stdoutstream; 
     delete logfilestream; 
    } 
    OutTeeTextStream &operator<<(auto data) 
    { 
     (*stdoutstream) << data; 
     if(logfilestream != 0) 
     { 
      (*logfilestream) << data; 
     } 
     return (*this); 
    } 
private: 
    QTextStream * stdoutstream; 
    QTextStream * logfilestream; 
    QFile file; 
}; 

당신이 볼 수 있듯이

는, 래퍼는 두 QTextStream의 인스턴스를 포함하며, 기본적으로 그들 각각에 데이터를 브로드 캐스트 스트림 삽입 연산자를 제공합니다.

C++ 14 (예 : C++ 11)를 사용하지 않으면 매개 변수 선언에 'auto'를 사용하는 것에 대한 불만이 있습니다. 이 경우 모든 삽입 (및 추출) 연산자 오버로드 (QTextStream에서 약 15/17)를 선언/정의해야합니다.

리 팩토링은 모든 QTextStream (stdout)을 OutTeeTextStream()으로 대체하는 것으로 구성됩니다.