2

我使用 boost::iostreams 编写了一个“接收器”,这样当有人尝试写入 iostream 对象时,我基本上可以运行我自己的代码。

不幸的是,系统中某处有一个缓冲区,因此我的 Sink 的 write() 函数仅每 4kB 左右调用一次。这是一个问题,因为我正在实现的接收器是固定大小(例如 128 字节),因此一旦写入了这么多数据,它就需要向调用者返回错误(类似于“磁盘已满”。)

由于缓冲区的原因,调用者能够写入几千字节的数据并且没有返回错误,然后当缓冲区被刷新时,额外的数据会默默地丢失,这给我带来了问题。

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

问题代码是我正在处理的库的一部分,如果有帮助,可以从 GitHub 获得(运行“make check”,您将看到一个由于此问题而导致的失败。)

任何建议将不胜感激!

4

1 回答 1

0

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

这是一个可怕的解决方法,但它似乎大部分时间都能完成这项工作。

于 2011-04-17T03:13:21.337 回答