Как вы можете отключить буфер в приемнике boost :: iostreams? - PullRequest
2 голосов
/ 19 августа 2010

Я написал 'сток', используя boost :: iostreams, так что я могу, по сути, запускать свой собственный код, когда кто-то пытается писать в объект iostream.

К сожалению, где-то в буфере естьсистема, так что функция write () моего Sink вызывается только каждые 4kB или около того.Это проблема, потому что реализуемый мной приемник имеет фиксированный размер (например, 128 байт), поэтому после записи этого большого количества данных необходимо вернуть вызывающей стороне ошибку (что-то вроде 'disk full').

Из-за буфера вызывающая сторона может записать несколько килобайт данных, и ошибки не возвращаются, затем, когда буфер очищается, лишние данные автоматически теряются, что вызывает у меня проблемы.

Кто-нибудьзнаете, возможно ли как-то отключить этот буфер?Я попробовал многие из предложенных здесь предложений для общих iostreams (например, pubsetbuf), но ни одно из них, похоже, не применимо к реализации Boost.

Код проблемы является частью библиотеки, над которой я работаю, которая является доступно из GitHub , если это поможет (запустите 'make check', и вы увидите один сбой из-за этой проблемы.)

Буду признателен за любые предложения!

1 Ответ

0 голосов
/ 17 апреля 2011

Я думаю, что нашел обходной путь.Вы должны вручную решить, когда вы хотите выполнить сброс, но если вы выполните поиск - даже поиск в той же позиции, то есть stream.seekp(0, std::ios::cur) - тогда это приведет к сбросу всего, как и ожидалось.

Этонемного ужасный обходной путь, но, похоже, большую часть времени он выполняет свою работу.

...