2010-08-13 56 views
1

我将一些C++代码从Unix移植到Linux(Red Hat)。从Unix到Linux移植ostream :: opfx/osfx

我遇到了以下模式:

ostream& myfunction(ostream& os) 
{ 
    if (os.opfx()) 
    { 
    os << mydata; 
    os.osfx(); 
    } 
    return os; 
} 

功能opfxosfx不可用红帽4.5。我看到一个建议here使用ostream::sentry功能:

ostream& myfunction_ported(ostream& os) 
{ 
    ostream::sentry ok(os); 
    if (ok) 
    { 
    os << mydata; 
    } 
    return os; 
} 

我从here看到的opfx目的是冲洗,并继续之前验证流的状态。

我的问题:

我以为ostream功能已经检查过流状态的流进行操作之前。这是真的?这在某些时候是不是真的?

是否需要替换opfxsentrysentry给我说operator<<不是已经给我了吗?

回答

1

任何现有的插件(除非它真的是可怕的越野车)已经在创建一个哨兵对象,所以只要您通过现有的插件来完成您的工作,您就不需要自己创建一个哨兵对象。

需要创造,当你直接写你的数据在自己的流缓冲区哨兵对象,没有任何现有插件的帮助(例如,当你不使用其他任何将创建一个哨兵给你)。

对于这段代码,你可以完全消除创建哨兵对象,并做一些事情,如:

ostream& myfunction(ostream& os) 
{ 
    return os << mydata; 
} 

注意的是,现有的代码被宣布为返回ostream &,但似乎并没有真正返回任何东西。

+0

谢谢你的建议。我在输入两个样品时错过了退货声明,并修复了它。 – Bill 2010-08-13 18:51:30