Здравствуйте, _Vi, Вы писали:
_Vi>Здравствуйте, MaximE, Вы писали: ME>>Пример: буфер + поток в одном флаконе. _Vi>Вывод в этом примере работает. Ввод нет. (описание ошибки
MaximE wrote:
> Здравствуйте, _Vi, Вы писали: > > _Vi>Здравствуйте, MaximE, Вы писали: > ME>>Пример: буфер + поток в одном флаконе. > _Vi>Вывод в этом примере работает. Ввод нет. (описание ошибки > <http://rsdn.ru/Forum/Message.aspx?mid=1929472&only=1>
Здравствуйте, MaximE, Вы писали: ME>MaximE wrote: >> Здравствуйте, _Vi, Вы писали: >> _Vi>Здравствуйте, MaximE, Вы писали: >> ME>>Пример: буфер + поток в одном флаконе. >> _Vi>Вывод в этом примере работает. Ввод нет. (описание ошибки >> Действительно, ввод не работает, неправильно реализован underflow/uflow. ME>fix:
Спасибо, работает, буду использовать.
Но есть один маленький нюанс: если дополнить Pi, например, до 3.1415926534, то оно вылетит, т.к. почему-то по умолчанию округляется до 5 цифр. (Фиксится добавлением "fs.precision(...);" при выводе).
Здравствуйте, _Vi, Вы писали:
_Vi>Здравствуйте, MaximE, Вы писали: ME>>MaximE wrote: >>> Здравствуйте, _Vi, Вы писали: >>> _Vi>Здравствуйте, MaximE, Вы писали: >>> ME>>Пример: буфер + поток в одном флаконе. >>> _Vi>Вывод в этом примере работает. Ввод нет. (описание ошибки >>> Действительно, ввод не работает, неправильно реализован underflow/uflow. ME>>fix: _Vi>Спасибо, работает, буду использовать.
На чтение он не очень эффективен: streambuf требует буферизации, хотя она бывает не нужна, как для случая с FILE*, когда буферизация осуществляется в libc. Отсюда и char buf_[1].
Я не знаю, решена ли эта проблема в boost::iostream.
_Vi>Но есть один маленький нюанс: если дополнить Pi, например, до 3.1415926534, то оно вылетит, т.к. почему-то по умолчанию округляется до 5 цифр. (Фиксится добавлением "fs.precision(...);" при выводе).
Здравствуйте, MaximE, Вы писали: ME>На чтение он не очень эффективен: streambuf требует буферизации, хотя она бывает не нужна, как для случая с FILE*, когда буферизация осуществляется в libc. Отсюда и char buf_[1].
По умолчанию оно читает побайтово, но если изменить char buf_[1]; на char buf_[16];, например, то оно начинает читать блоками по 16 байт и сохранять у себя. (По идее мне это и нужно). Или там получается дублирование буфферизации? (в этом классе и ещё где-то stream'ах)
(Вообще я собираюсь написать вместо fread/fwrite своё и использовать это для сокетов или ReadFile/WriteFile или ещё чего-либо...).
_Vi wrote:
> Здравствуйте, MaximE, Вы писали: > ME>На чтение он не очень эффективен: streambuf требует буферизации, хотя > она бывает не нужна, как для случая с FILE*, когда буферизация > осуществляется в libc. Отсюда и char buf_[1]. > По умолчанию оно читает побайтово, но если изменить char buf_[1]; на > char buf_[16];, например, то оно начинает читать блоками по 16 байт и > сохранять у себя. (По идее мне это и нужно). Или там получается > дублирование буфферизации? (в этом классе и ещё где-то stream'ах)
С блочного устройства (hard disk, к примеру) операционная система считывает
блоками — кэширование. FILE* по-умолчанию буферизуется. streambuf обязывает
использовать буферизацию при чтении.
Чтобы избежать ненужной буферизации и копирования kernel -> user space часто
гораздо проще отобразить файл в память.
Здравствуйте, MaximE, Вы писали: ME>Чтобы избежать ненужной буферизации и копирования ... ME>Maxim Yegorushkin
Но для сокетов и pipe'ов это пойдёт нормально? (Какой размер буффера посоветуешь?).
_Vi wrote:
> Здравствуйте, MaximE, Вы писали: > ME>Чтобы избежать ненужной буферизации и копирования ...
> Но для сокетов и pipe'ов это пойдёт нормально? (Какой размер буффера > посоветуешь?).
Зависит от протокола (поверх tcp/udp/...), который использует твоя программа.