2010-08-19 3 views
2

Я написал «раковину», используя boost :: iostreams, так что я могу по существу запустить свой собственный код, когда кто-то пытается записать объект iostream.Как вы можете отключить буфер в boost :: iostreams sink?

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

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

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

Код проблема является частью библиотеки я работаю, который available from GitHub, если это помогает (бег «сделать чек», и вы увидите одну неудачу из-за этой проблемы.)

Любые предложения будут значительно оценили!

+0

Хмм ... документация по буферизации говорит '[Будет поставляться в следующей версии]' датирована 02.02.2008 г. ... вздох ... – Inverse

ответ

0

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

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

Смежные вопросы