2010-12-18 5 views
2

ostream에 접두사를 추가하는 방법을 찾고 다른 기능에 전달하여 출력에 접두어를 붙인 다음 계속하려면 제거하십시오.ostream 출력에 접두사 추가

확인 다음 의사 :

... 
Whatever 
function: output 1 
function: output 2 
... 

들이 그 보초가/접미을 접두어로 사용할 수 있습니다 상태 ostream에의 문서를 보면하지만 난 안 : 같은 출력으로

... 
void function(ostream &out){ 
    out << "output 1\n"; 
    out << "output 2\n"; 
} 

cout << "Whatever\n"; 
add_suffix(cout,"function: "); 
function(cout); 
remove_suffix(cout); 
... 

의도 한 용도가 내가 원한 것이라면이 작업을 수행하는 방법을 알아야합니다.

ostream::sentry 문서는 말한다 : 여기에 기록 된 모든 줄 바꿈 후 접두사를 삽입하는 streambuf이며, 대상 버퍼에 출력을 보내는 YourStreamBuffer을 정의

sentry: Perform exception safe prefix/suffix operations 

답변

4

일반적인 방법은 다음과 같이 간다 . 그렇다면 다음과 같이 사용하십시오 :

스트림 버퍼를 구현하는 방법에 대한 예제는 많이 있습니다. 또한 코드가 예외 안전인지 확인하십시오. 예외가 발생하더라도 oldBuf를 복원하십시오.

참고 : 센트리는 다른 것이므로 여기에 필요한 것이 아닙니다.

+0

streambufs 그리고 그건 내 독창적 인 아이디어였습니다. 그런 일을하지 않으면 왜 보초가 문서화되어 있는지 궁금합니다. –

+1

@Arkaitz : 언급 된 "prefix"에는 스트림을 읽거나 쓰는 함수 접두사가 있습니다. 이것들은 스트림의 상태를 체크하고 스트림이 나쁜 상태에있을 때 예외를 던지기위한 것이다. – ybungalobill

+0

멋지다. 이제는 스트림 컨텍스트의 접두어와 접미어 연산이 원했던 것처럼 너무 많이 보였습니다. 그렇다면 streambuf 구현에 묶여있는 것 같습니다. –

0

또는이에 대한 악한 매크로를 사용할 수 있습니다 ..

#define f_str(str) str << __FUNCTION__ << ' ' 

를 (예, __FUNCTION__이 ... 이봐 모든 곳에서 정의 된 것이 아니라) Negtive는 당신이 포장 매크로를 사용한다는 것을 긍정적 인 점은 모든 일련의 스트림 작업에 대해 이름을 한 번만 삽입한다는 것입니다 (스트림 버퍼의 경우 모든 새로운 행의 접두어가 붙을 것입니다.) [

관련 문제