如何在boost :: iostreams接收器中禁用缓冲区?

时间:2010-08-19 16:11:15

标签: c++ boost-iostreams

我使用boost :: iostreams写了一个'sink',这样当有人试图写入iostream对象时,我本可以运行自己的代码。

不幸的是系统中某处有一个缓冲区,所以我的Sink的write()函数只能在每4kB左右被调用一次。这是一个问题,因为我实现的接收器是一个固定的大小(例如128个字节),所以一旦写入这么多数据,就需要向调用者返回一个错误(类似'disk full'。)

由于缓冲区,调用者能够写入几千字节的数据并且没有返回错误,所以稍后当刷新缓冲区时,额外的数据会无声地丢失,这会导致我出现问题。

有谁知道是否有可能以某种方式禁用此缓冲区?我在这里尝试了许多关于通用iostream的建议(例如pubsetbuf),但它们似乎都没有适用于Boost实现。

问题代码是我正在处理的库的一部分,如果它有帮助,则为available from GitHub(运行'make check',因为这个问题你会看到一个失败。)

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方法。您必须手动决定何时执行刷新,但如果您进行搜索 - 甚至寻求相同的位置,即stream.seekp(0, std::ios::cur) - 那么它将导致所有内容按预期刷新。

这是一个可怕的解决方法,但似乎大部分时间都在做这个工作。