2012-11-15 5 views
1

std :: cout을 사용하여 화면에 인쇄하는 C++ 프로그램이 있습니다.프로그램을 서비스로 실행할 때 std :: cout 리디렉션

때로는 서비스로 실행해야합니다. 그것이 Windows 서비스로 실행 중일 때 cout 출력을 볼 수있는 방법이 있습니까?

출력을 파일 또는 일종의 디버깅 프로그램으로 리디렉션하는 것이 이상적입니다.

분명히 필자는 파일에 쓰는 함수로 교체 할 수 있습니다. 아마도 그럴 것입니다. 그러나 다른 솔루션이 있는지 궁금합니다.

+1

Unix 시스템에서는 프로세스를 시작할 때 표준 출력을 리디렉션 할 수 있지만 Windows에서 이와 같은 것에 익숙하지 않습니다. 아마 존재해야합니다. –

+0

프로세스 또는 파이핑을 시작한 후에 표준 출력을 리디렉션하는 것이 내가 원하는 것입니다. – Meir

+0

Windows에서 이러한 기능에 대한 조사를 해보십시오. 이런 것이 있어야합니다. 나는 "윈도우에서 프로세스의 출력을 리다이렉트 (redirect output)"하는 것과 같은 것입니다. –

답변

2

기본적으로 무한한 옵션이 있습니다. 마음에 와서 그 처음 몇은 :

ostream에 참조 주위

패스

당신은 표준 : : ostream에 참조 주위에 전달할 수 :

void someFunc(std::ostream& out) { 
    //someFunc doesn't need to know whether out is a file, cout, or whatever 
    out << "hello world" << std::endl; 
} 

파일과 기본 버퍼 cout 교체

예 : cplusplus.com :

streambuf *psbuf, *backup; 
ofstream filestr; 
filestr.open ("test.txt"); 

backup = cout.rdbuf();  // back up cout's streambuf 

psbuf = filestr.rdbuf(); // get file's streambuf 
cout.rdbuf(psbuf);   // assign streambuf to cout 

cout << "This is written to the file"; 

freopen을 사용하는 1 라이너가 있지만, stdin 및 cout이 동기화되지 않을 수 있기 때문에 정의되지 않은 동작이라는 점에 대해 나는 기분이 상할 만하다 (그리고 this는 코멘트에서이를 강화하는 것으로 보인다).

freopen("/path/to/file", "r", stdout); 
//cout is now writing to path/to/file 

당신이 전체 나가서 로깅 라이브러리의 몇 가지 유형을 사용할 수 확실하지 내 머리 위로의 좋은 하나의

하지만 로깅 라이브러리입니다. (윈도우 이벤트를 사용하면 출력하는지에 따라하지만, 그 이해가되지 않을 수도 있습니다.)

배관

나는이 Windows 서비스 가능합니다 의심하지만,이 경우, 항상있다 고전 리디렉션 :

blah.exe > C:\path\file 
1

쉬운 해결책은 SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)입니다.

관련 문제