![](/img/trans.png)
[英]Why boost::iostream::filtering_ostream using boost::iostreams::zlib_compressor needs to be destroyed for the sink to be written?
[英]in boost iostream filtering_ostream, what is the difference between sync(), strict_sync() and flush()?
考慮簡單的計數過濾器:
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;
};
並使用它:
boost::iostreams::filtering_ostream counted_cout;
counted_cout.push(CountableOstreamFilter());
counted_cout.push(std::cout);
counted_cout << "hello world";
調用sync(),strict_sync()或flush()之間有什么區別? counted_cout.sync(); //與此調用有什么不同count_cout.strict_sync(); //給這個電話count_cout.flush(); //給這個電話?
我正在使用boost 1.50.0
sync
, strict_sync
和flush
之間的關鍵區別在於它們的返回值。 所有3個。 所有這些都在任何Filter或Device上調用flush方法,該filter或Device是滿足Flushable概念的filtering_stream
的一部分。 簡單地跳過任何不支持Flushable概念的過濾器/設備。
除非其中一個可刷新的過濾器/設備返回false,否則sync
將返回true。 這意味着如果有不可刷新的過濾器/設備屬於filtering_stream
,數據可能會卡在其中,但sync
將返回true,因為它們不是Flushable。
strict_sync
類似,除非它遇到不可刷新的過濾器/設備。 在這種情況下,即使所有可strict_sync
的過濾器/設備都可能返回true, strict_sync
也將返回false。 這樣做的原因是strict_sync
的調用者知道如果它返回true,則所有數據都被成功刷新。
成員flush
只返回對流的引用,有效地丟棄刷新是否成功。 非成員flush
具有它自己的規則,它根據輸入值返回它
在您的情況下, CountableOstreamFilter
不可刷新(它不能轉換為必需的flushable_tag)。 因此,只要底層流上的刷新成功,對sync
調用就會返回true。 但是, strict_sync
應該返回false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.