Каково обоснование отсутствия наличия функции writeome для basic_ostream в STL?

Работая над сетевой библиотекой, я недавно заметил, что наличие подвески к basic_streambuf :: in_avail в сочетании с функцией writeome было бы очень удобно для асинхронного ввода-вывода.

Я искал в Интернете и проверил несколько ссылок C ++, если есть какая-либо функция, которая отвечает этим требованиям, но, похоже, мне не повезло. Единственный источник, который упоминает подобную функциональность Boost’s Asio библиотека, однако в описании четко говорится, что вызов функции будет блокироваться до тех пор, пока не будет отправлен хотя бы один байт, что не отражает мое желаемое поведение.

Чтобы уточнить мой вопрос, я создал черновик, основанный на публикации C ++ N3337.

27.6.3.2.5 Место размещения [streambuf.pub.put]

streamsize in_depart();

Возвращает: Если позиция записи доступна, возвращает epptr() - pptr(), Иначе
возвращается showmanycp(),

27.6.3.4.5 Место размещения [streambuf.virt.put]

streamsize showmanycp();

Возвращает: Оценка количества символов, которые можно записать в последовательность,
или же -1, Если он возвращает положительное значение, то последовательные вызовы overflow() не буду
вернуть traits::eof() пока по крайней мере это количество символов не будет записано в
поток. Если showmanycp() возвращается -1затем звонит overflow()не удастся.

Поведение по умолчанию: Возвращает ноль.

Примечания: Пользы traits::eof(),

27.7.3.7 Неформатированные выходные функции [ostream.unformatted]

streamsize writesome(char_type* s, streamsize n);

Последствия: Ведет себя как неотформатированная функция вывода (как описано в пункте 27.7.3.7.
1). После постройки сторожевого объекта, если !good() звонкиsetstate(failbit) который может
бросить исключение и вернуть. В противном случае пишет n символы, обозначенные s, Если
rdbuf()->in_depart() == -1, звонки setstate(badbit) (который может бросить
ios_base::failure (27.5.5.4)) и не пишет символов;

— Если rdbuf()->in_depart() == 0, пишет без символов.

— Если rdbuf()->in_depart() > 0пишет min(rdbuf()->in_depart(), n)) персонажи.

Возвращает: Количество написанных символов.

2

Решение

Я предполагаю, что вы неверно истолковали значение in_avail() а также readsome(): все это говорит о том, что поток прочитал блок данных и в буфере все еще есть символы. Да, теоретически это может сделать что-то другое, но, в частности, при чтении из сети вы не знаете, сколько данных доступно, пока не попробуете их прочитать.

Точно так же нет способа гарантировать возможность избавиться от определенного количества символов: что бы out.writesome(buf, n) имею в виду? Если вы хотите, чтобы это означало, что вы бросили n персонажи в outбуфер, вы можете просто создать подходящий буфер потока и использовать write(), Гарантируя, что n байты отправляются с блокировкой, однако не могут быть выполнены (по крайней мере, для 1 < n). Я думаю, что вы хотите последнее, хотя.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]