nixp.ru v3.0

24 мая 2017,
среда,
07:18:45 MSK

DevOps с компанией «Флант»
newcomer написал 11 апреля 2008 года в 13:23 (1366 просмотров) Ведет себя неопределенно; открыл 3 темы в форуме, оставил 17 комментариев на сайте.

Здравствуйте!

Мне необходимо создать свой поток наследуя классы iostream и streambuf, всё вроде понятно. Но в процессе изучения этих классов я столкнулся с некоторой проблемой.

Класс streambuf имеет шесть указателей, три для ввода три для вывода. Первый указатель указывает на начало буфера, второй — текущая позиция в буфере, третий на элемент за концом буфера и так для обоих потоков. Вроде нарашивается мысль, что два буфера. Но для установки буфера существует один метод setbuf, для какого потока он устанавливает буфер?

myst

Посмотри в реализации этого метода ;-) На моей системе этот метод ничего не делает. Видимо, в стандарте прописано, что он имеет рекомендательный характер, что и не удивительно. Стандарт можно скачать <font color=«blue»>тут</font>.

metal

http://www.cplusplus.com/reference/iostream/streambuf/

Внимательно прочитай, там даже объясняется что ты должен в своем задании сделать:)

newcomer
myst
Посмотри в реализации этого метода ;-) На моей системе этот метод ничего не делает. Видимо, в стандарте прописано, что он имеет рекомендательный характер, что и не удивительно. Стандарт можно скачать <font color=«blue»>тут</font>.

Да метод не делает ничего в самом streambuf, но в наслеуемых от него классах должен бы: filebuf, stringbuf.

Думаю, что придётся лезть в исходники, он как не хотелось на это убивать целый день, а то и больше. Я просто уже пробовал, но нашёл только, что это метод вызвает другой __IO_file_setbuf, а это метод в свою очередь не известно где определён, грепил все тексты но нет его, может что-то не хватает (я не пробовал собрирать либу), вот сиди разбирайся, копайся в коде из-за того, что кто-то пару строк коментов не добавил или не описал где-нибудь :-(

newcomer
metal
http://www.cplusplus.com/reference/iostream/streambuf/

Внимательно прочитай, там даже объясняется что ты должен в своем задании сделать:)

Если не трудно можете копипаст сделать того объяснения, я копался на этом сайте до того как задать этот вопрос, но не нашёл.

newcomer
newcomer
Если не трудно можете копипаст сделать того объяснения, я копался на этом сайте до того как задать этот вопрос, но не нашёл.

Не обязательно все, хотябы несколько слов…

newcomer
metal
http://www.cplusplus.com/reference/iostream/streambuf/

Внимательно прочитай, там даже объясняется что ты должен в своем задании сделать:)

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.

Здесь сказано, что указатели могут ссылаться на разные участки памяти, но как устанавливать эти участки памяти раздельно для ввода и вывода там я не нашёл.

newcomer

Если копать в исходниках то установка буфера для filebuf сводится к установки буфера на указатель FILE*fp, то есть я думаю на setvbuf. Но мне там тоже не понятно пока как же там обходятся если файл открыт на чтение и запись…

newcomer

я разобрался поговорив сам с собой :-)

newcomer

Вернее я разобрался с функцией setvbuf судя по исходником здесь тоже самое

newcomer

http://www.mr-edd.co.uk/?p=16