什么时候调用stringbuf :: flush?

时间:2014-01-29 18:53:00

标签: c++ synchronization stringbuffer c++-standard-library

struct encrypt_stream : public std::stringbuf
{
    int sync() { encrypt_buffer(); flush_to_device(); }
    ...
private:
    void encrypt_buffer();
    void flush_to_device();
};

我想写这个类来加密文本数据。每次刷新stringbuf对象时,都会调用sync并将缓冲区的加密版本发送到设备。加密文本很大程度上取决于调用flush的时刻。是否有棘手的情况可以在没有用户要求的情况下在此对象上调用flush

我知道收到flush时会调用std::endl,但还有其他我不知道的情况吗?

1 个答案:

答案 0 :(得分:4)

在这些情况下调用

flush()

  • 使用std::endl时(即显式调用std::ostream::flush())[§27.7.3.7/ 7]
  • 当流的析构函数被调用[§27.5.3.1.6/ 4]
  • tie() - ed的流执行读取时。 [§27.7.2.1.3/ 2]
  • 重新定位文件流时。
  • 当流已达到其缓冲区中的最大分配字符数时,调用overflow()将内容提取到外部设备时,[§27.6.3.4.5/ 3]
  • 或者在输入流的情况下,当gptr() == egptr()时,调用underflow()以丢弃内容并将其缓冲区与外部设备同步。 [§27.6.3.4.3/ 7]

这就是我对标准IOStream的了解。这可能会因您的流或流缓冲区的实现而有所不同。