newcomer
написал 11 апреля 2008 года в 13:23 (2326 просмотров)
Ведет себя
неопределенно; открыл 3 темы в форуме, оставил 17 комментариев на сайте.
Здравствуйте!
Мне необходимо создать свой поток наследуя классы iostream и streambuf, всё вроде понятно. Но в процессе изучения этих классов я столкнулся с некоторой проблемой.
Класс streambuf имеет шесть указателей, три для ввода три для вывода. Первый указатель указывает на начало буфера, второй — текущая позиция в буфере, третий на элемент за концом буфера и так для обоих потоков. Вроде нарашивается мысль, что два буфера. Но для установки буфера существует один метод setbuf, для какого потока он устанавливает буфер?
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Посмотри в реализации этого метода ;-) На моей системе этот метод ничего не делает. Видимо, в стандарте прописано, что он имеет рекомендательный характер, что и не удивительно. Стандарт можно скачать <font color=«blue»>тут</font>.
http://www.cplusplus.com/reference/iostream/streambuf/
Внимательно прочитай, там даже объясняется что ты должен в своем задании сделать:)
Да метод не делает ничего в самом streambuf, но в наслеуемых от него классах должен бы: filebuf, stringbuf.
Думаю, что придётся лезть в исходники, он как не хотелось на это убивать целый день, а то и больше. Я просто уже пробовал, но нашёл только, что это метод вызвает другой __IO_file_setbuf, а это метод в свою очередь не известно где определён, грепил все тексты но нет его, может что-то не хватает (я не пробовал собрирать либу), вот сиди разбирайся, копайся в коде из-за того, что кто-то пару строк коментов не добавил или не описал где-нибудь :-(
Если не трудно можете копипаст сделать того объяснения, я копался на этом сайте до того как задать этот вопрос, но не нашёл.
Не обязательно все, хотябы несколько слов…
Set buffer
This member is called to set a new buffer for the streambuf object. The public member function pubsetbuf calls this protected member function to perform this action.
This is a virtual member function that shall be redefined in derived classes to behave as expected by setting the array of n characters pointed by s as the new character buffer. Its default behavior in streambuf is to do nothing and return a reference to the object (this), but it is redefined in both standard derived class, filebuf and stringbuf, to behave as expected specifically for each type of buffer (see filebuf::setbuf and stringbuf::setbuf).
Здесь говорится, что по умолчанию он ничего не делает, что это метод должен быть преопределён и он переопределён в filebuf и stringbuf и всё.
Для файл буфера вообще ничего не сказано:
Set buffer
This member is called to set a new memory buffer for the streambuf object. If both parameters are zero, and no input/output operation has yet taken place on this stream, the stream becomes unbuffered.
The inherited public member function pubsetbuf calls this overriden protected member function to perform this action.
Для строкового так же:
This member is called to set a new memory buffer for the streambuf object. If both parameters are zero, and no input/output operation has yet taken place on this stream, the stream becomes unbuffered.
The inherited public member function pubsetbuf calls this overriden protected member function to perform this action.
Есть ещё такое описание:
All the pointers defining one of the sequences must point to locations of the same array in memory, but each of the groups may be referring to different arrays, different regions of a unique array, or the same array.
Здесь сказано, что указатели могут ссылаться на разные участки памяти, но как устанавливать эти участки памяти раздельно для ввода и вывода там я не нашёл.
Если копать в исходниках то установка буфера для filebuf сводится к установки буфера на указатель FILE*fp, то есть я думаю на setvbuf. Но мне там тоже не понятно пока как же там обходятся если файл открыт на чтение и запись…
я разобрался поговорив сам с собой :-)
Вернее я разобрался с функцией setvbuf судя по исходником здесь тоже самое
http://www.mr-edd.co.uk/?p=16