为ostream输出添加前缀

时间:2010-12-18 21:04:37

标签: c++ gcc iostream apache-sentry

我正在寻找一种向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);
...

输出如:

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

查看ostream的文档,他们声明哨兵可能用于前缀/后缀,但如果预期用途是我想要的,我不知道如何做到这一点。

ostream::sentry文档说:

sentry: Perform exception safe prefix/suffix operations

2 个答案:

答案 0 :(得分:4)

一般方式如下:定义YourStreamBuffer,它是一个streambuf,它在写入任何换行符后插入前缀,并将输出发送到目标缓冲区。然后像这样使用它:

streambuf *oldBuf = cout.rdbuf();

YourStreamBuffer yourBuf(oldBuf, "function: ");
// everything written to yourBuf is sent to oldBuf

cout.rdbuf(&yourBuf);
function(cout);
cout.rdbuf(oldBuf);

您可以在网上找到很多关于如何实现流缓冲区的示例。 还要确保您的代码是异常安全的,即使抛出异常也会恢复oldBuf。

注意:哨兵是不同的,这不是你需要的。

答案 1 :(得分:0)

或者,你可以使用一个邪恶的宏..

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

(是的,__FUNCTION__没有在任何地方定义,但是嘿......)否定的是你必须使用宏来包装,肯定的是它只为所有链式流操作插入一次名称(在流缓冲区的情况下,它将为所有新行添加前缀[除非你想要的当然!]