Программирование >>  Операторы преобразования типа 

1 ... 206 207 208 [ 209 ] 210 211 212 ... 239


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));



1 ... 206 207 208 [ 209 ] 210 211 212 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика