Avi*_*hek 1 c++ boost iostream boost-iostreams
考虑一个简单的计数过滤器:
class CountableOstreamFilter : public boost::iostreams::multichar_output_filter {
public:
CountableOstreamFilter(): m_written(0) {
}
template<typename Sink>
std::streamsize write(Sink& dest, const char* s, std::streamsize n)
{
auto result = boost::iostreams::write(dest, s, n);
assert(n == result);
m_written += result;
return result;
}
inline std::streamsize writtenBytes() const {
return m_written;
}
private:
std::streamsize m_written;
};
Run Code Online (Sandbox Code Playgroud)
并这样使用它:
boost::iostreams::filtering_ostream counted_cout;
counted_cout.push(CountableOstreamFilter());
counted_cout.push(std::cout);
counted_cout << "hello world";
Run Code Online (Sandbox Code Playgroud)
调用sync()、strict_sync() 或flush() 之间有什么区别?counted_cout.sync(); // 与此调用有什么不同 counted_cout.strict_sync(); // 调用 counted_cout.flush(); // 这个调用?
我使用的是boost 1.50.0
sync、strict_sync、 和之间的主要区别flush是它们的返回值。他们三个。它们都在属于filtering_stream满足可刷新概念的任何过滤器或设备上调用刷新方法。任何不支持可冲洗概念的过滤器/设备都会被简单地跳过。
sync除非可冲洗过滤器/设备之一返回 false,否则返回 true。这意味着,如果存在不可刷新的过滤器/设备filtering_stream,数据可能会卡在其中,但sync会返回 true,因为它们不可刷新。
strict_sync类似,除非遇到不可冲洗的过滤器/设备。在这种情况下,strict_sync将返回 false,即使所有可刷新过滤器/设备可能返回 true。这样做的原因是,调用者strict_sync知道如果它返回 true,则所有数据都已成功刷新。
该成员flush只是返回对流的引用,从而有效地丢弃刷新是否成功。非成员flush 有自己的返回规则,具体取决于输入值
在您的情况下,CountableOstreamFilter不是可冲洗的(它不能转换为必要的可冲洗标签)。sync因此,只要底层流上的刷新成功,调用就会返回 true。但是,strict_sync应该返回 false。
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |