|
Программирование >> Операторы преобразования типа
Функция reglster callback() получает два аргумента: указатель на функцию и число Int. Аргумент Int передается в третьем аргументе при вызове зарегистрированной функции. Например, он может использоваться для идентификации индекса pword(), то есть определять обрабатываемый элемент массива. Аргумент strm, передаваемый функции обратного вызова, содержит объект los base, обратившийся к этой функции. Аргумент е определяет причину вызова, его допустимые значения перечислены в табл. 13.40. Таблица 13.40. Причины обратного вызова
При вызове для объекта функции copyfmt() функции обратного вызова вызываются дважды. Еще до начала копирования они вызываются с аргументом erase event для выполнения необходимой зачистки (например, удаления объектов, хранящихся в массиве pwordO). После копирования данных форматирования функции обратного вызова вызываются снова, на этот раз - с аргументом сору event. Например, этот проход может использоваться для организации глубокого копирования объектов, хранящихся в массиве pwordO- Обратите внимание: вместе с данными форматирования копируются и функции обратного вызова, а исходный список зарегистрированных фзкций удаляется. Следовательно, при втором проходе будут вызваны только что скопированные функции. Механизм обратного вызова чрезвычайно примитивен. Он не позволяет отменять регистрацию функций обратного вызова (не считая вызова copyfmt() с аргументом, не имеющим зарегистрированных функций). Кроме того, повторная регистрация функции обратного вызова даже с тем же аргументом приведет к повторному вызову. Тем не менее библиотека гарантирует, что функции будут вызваны в порядке, обратном порядку их регистрации. Это сделано для того, чтобы функция обратного вызова, зарегистрированная из другой функции, не вызывалась до следующего срабатывания функций обратного вызова. 1равила построения пользовательских >ператоров ввода-вывода Ниже перечислены некоторые правила, которые должны соблюдаться в пользовательских реализациях операторов ввода-вывода. Эти правила продиктованы типичным поведением стандартных операторов. О Выходной формат должен допускать определение оператора ввода, читающего данные без потери информации. В некоторых случаях - особенно для строк - эта задача практически невыполнима из-за проблем с пробелами. Пробел внутри строки невозможно отличить от пробела, разделяющего две строки. Классы потоковых буферов Как упоминалось на с. 564, потоки данных не выполняют непосредственные операции чтения и записи, а поручают их потоковым буферам. Этот раздел посвящен работе классов буферов. Приведенный материал не только поможет глубже разобраться в том, как работают потоки данных при вводе-выводе, но и заложит основу для определения новых каналов ввода-вывода. Прежде чем переходить к подробному описанию потоковых буферов, рассмотрим их открытый интерфейс. Потоковые буферы с точки зрения пользователя с точки зрения пользователя потокового буфера, класс basic streambuf представляет собой нечто, принимающее н отправляющее символы. В табл. 13.41 приведены версии открытых функций для вывода символов. Таблица 13.41. Открытые функции вывода символов Функция Описание sputc(c) Выводит символ с в потоковый буфер sputc(5, п) Выводит п символов из последовательности s в потоковый буфер Функция sputc() возвращает traits type::eof() в случае ошибки, где trait5 type - определение типа в классе basic streambuf. Функция sputn() выводит количество символов, заданное вторым аргументом, если только выводу не помешают недостаточные размеры строкового буфеа. Символы завершения строк при выводе не учитываются. Фзт1кция возвращает количество выведенных символов. О При вводе-выводе должна учитываться текущая форматная спецификация потока данных. Прежде всего это относится к ширине поля при выводе. О При возникновении ошибок должен быть установлен соответствующий флаг состояния. О Ошибки не должны изменять состояние объекта. Если оператор читает несколько объектов данных, промежуточные результаты сохраняются во временных объектах до окончательного принятия значения. О Вывод пе должен завершаться символом повой строки, в осповпом из-за того, что это не позволит вывести другие объекты в той же строке. О Даже слишком большие данные должны читаться полностью. После чтения следует установить соответствующий флаг ошибки, а возвращаемое значение должно содержать полезную информацию (например, максимальное допустимое значение). О При обнаружении ошибки форматирования следует по возможности прекратить чтение. Интерфейс чтения символов из потокового буфера устроен несколько сложнее (табл. 13.42). Дело в том, что при вводе иногда требуется узнать символ без его извлечения из буфера. Кроме того, желательно предусмотреть возможность возврата символов в потоковый буфер. Соответствующие функции поддерживаются классами потоковых буферюв. Таблица 13.42. Открытые функции ввода символов Функция Описание in avail() Возвращает нижнюю границу доступных символов sgetcO Возвращает текущий символ без его извлечения из буфера sbumpcO Возвращает текущий символ с извлечением из буфера snextcO Извлекает текущий символ из буфера и воэвраиает следующий символ sgetn(b,n) Читвет п симвопов и сохраняет их в буфере b sputbackc(c) Возвращает символ с в потоковый буфер sungetcO Возвращается на одну позицию к предыдущему символу Функция in avail() проверяет минимальное количество доступных символов. Например, с ее помощью можно убедиться в том, что чтение не будет заблокировано при вводе с клавиатуры. С другой стороны, количество доступных символов может быть больще значения, возвращаемого этой функцией. Пока потоковый буфер не достигнет конца потока данных, один из символов считается текущим . Функция sgetc() используется для получения текущего символа без перемещения к следующему символу. Функция sbumpc() читает текущий символ и переходит к следующему символу, который становится текущим. Последняя из функций чтения отдельных символов, snextc(), переходит к следующему символу и читает новый текущий символ. Для обозначения неудачи все три функции возвращают traits type::eof(). Функция sgetn() читает в буфер последовательность символов, максимальная длина которой передается в аргументе. Функция возвращает количество прочитанных символов. Функции sputbackcO и sungetc() возвращаются на одну позицию в потоке данных, вследствие чего текущим становится предыдущий символ. Функция SputbackcO может использоваться для замены предыдущего символа другим символом. При вызове этих функций необходимо соблюдать осторожность: нередко возврат ограничивается всего одним символом. Отдельная группа функций используется для подключения объекта локального контекста, для смены позиции и управления буферизацией. Эти функции перечислены в табл. 13.43. Функции pubimbue() и getlocO используются при интернационализации (см. с. 601). Функция pubimbueO подключает новый объект локального контекста к потоковому буферу и возвращает ранее установленный объект локального контекста. Функция getlocO возвращает текущий объект локального контекста.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |