|
Программирование >> Операторы преобразования типа
protected: /* Главная функция вывода * - вывод символов в верхнем регистре virtual typename traits::int type overflow (typename traits::1nt type c) ( if ([traits::eq int type(c.traits::eof())) { Преобразование символа к верхнему регистру с = std;:toupper(c,getloc()): Запись символа в стандартный вывод if (putchar(c) EOF) { return traits:;eof(); return traits;:not eof(c); typedef bas1c outbuf<char> outbuf: typedef basic outbuf<wchar t> woutbuf: Пусть этот потоковый буфер используется в представленной ниже программе: io/outbufl.cpp finclude <1ostream> Iinclude outbuf1.hpp int mainO outbuf ob: Создание специального буфера вывода std::ostream out(&ob): Инициализация выходного потока созданным буфером вывода out 31 hexadecimal: std;:hex 31 std;;endl: В этом случае будет получен следующий результат: 31 HEXADECIMAL: IF Аналогичный подход может использоваться при записи в другие приемники. Так, для инициализации объекта конструктору потокового буфера можно передать дескриптор файла, имя сокетного соединения или два других потоковых буфера, используемые для одновременной записи. Чтобы организовать вывод в соответствующий приемник, достаточно реализовать функцию overflow(). Кроме того, функцию xsputnO следует реализовать для оптимизации вывода в потоковый буфер. Чтобы конструировать потоковые буферы было проще, рекомендуется также реализовать специальный класс потока данных, назначение которого сводится к передаче аргументов конструктора соответствующему потоковому буферу. В следующем примере показано, как это делается. В данном случае определяется класс потокового буфера, который инициализируется файловым дескриптором, используемым для записи символов функцией write() (низкозфовневая функция ввода-вывода в системах семейства UNIX). Также определяется класс, производный от ostream, - он поддерживает потоковый буфер, которому передается файловый дескриптор. io/oubuf2.hpp Iinclude <iostrearn> Iinclude <streambuf> Iinclude <cstdio> extern C { int write (int fd. const char* buf, int nun); class fdoutbuf : public std;:streambuf { protected: int fd: Файловый дескриптор publ1 с: Конструктор fdoutbuf (int fd) : fd( fd) { } protected: Запись одного символа virtual 1nt type overflow (1nt type c) { if (c !- EOF) { char z - C: if (write (fd, &z. 1) !- 1) { return EOF; return c: Запись нескольких символов virtual std;:streamslze xsputn (const char* s, std::streamsize num) ( return write(fd.s.num): class fdostream : public std::ostream { protected: fdoutbuf buf: public: fdostream (int fd) : std::ostream(0). buf(fd) { rdbuf(&buf): Потоковый буфер также реализует функцию xsputn(), позволяющую предотвратить вызов overflowO для каждого символа при отправке в буфер последовательности символов. Функция записывает всю последовательность символов в файл, заданный дескриптором fd, за один вызов. Функция xsputn() возвращает количество успешно выведенных символов. Пример: io/outbuf2.cpp #include <1ostrearn> finclude outbuf2.hpp int mainO { fdostream out(l): Поток с буфером, записывающим no дескриптору 1 out 31 hexadecimal: std::hex 31 std;:endl: Программа создает выходной поток данных, инициализируемый дескриптором файла 1. По действующим правилам этот дескриптор соответствует стандартному каналу вывода. Следовательно, в данном примере символы будут просто направляться в стандартный выходной поток данных. В аргументе конструктора также могут использоваться другие дескрипторы (например, дескриптор файла или со кета). Чтобы потоковый буфер действительно обеспечивал буферизацию, буфер вывода должен быть инициализирован функцией setp(). В следующем примере показано, как это делается: io/outbuf3.hpp finclude <cstd1o> finclude <streambuf> extern C { int write (int fd. const char* buf. int num); class outbuf ; public std:;streambuf { protected; static const int bufferSize = 10: Размер буфера данных char buffer[bufferS1ze]; Буфер данных public; /* Конструктор * - Инициализация буфера данных * - на один символ меньше, чтобы при накоплении bufferSize символов * вызывалась функция overflowO */ outbufО { setp (buffer. buffer+(bufferSi2el));
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |