Класс strstreambuf
Описывает буфер потока, который управляет передачей элементов из последовательности элементов, содержащейся в объекте массива char
, и в эту последовательность.
Синтаксис
class strstreambuf : public streambuf
Замечания
В зависимости от способа создания объекта он выделяется, расширяется и освобождается при необходимости для обеспечения соответствия изменениям в последовательности.
Объект класса strstreambuf
хранит несколько битов сведений о режиме в качестве своего режима strstreambuf
. Эти биты определяют следующие сведения об управляемой последовательности:
она выделена, и ее со временем нужно освободить;
ее можно изменять;
она расширяется за счет перераспределения хранилища;
она заморожена, поэтому ее необходимо разморозить до уничтожения или освобождения (если он выделен) объекта элементом, отличным от объекта.
Замороженную управляемую последовательность невозможно изменить или расширить независимо от состояния этих отдельных битов режима.
Объект также хранит указатели на две функции, которые управляют выделением strstreambuf
. Если это пустые указатели, объект использует собственный метод выделения и освобождения памяти для управляемой последовательности.
Примечание.
Этот класс устарел. Вместо этого следует использовать stringbuf или wstringbuf.
Конструкторы
Конструктор | Description |
---|---|
strstreambuf | Создает объект типа strstreambuf . |
Функции элементов
Функция-член | Description |
---|---|
freeze | Делает буфер потока недоступным для операций с буфером потока. |
overflow | Защищенная виртуальная функция, которая может вызываться при вставке нового символа в полный буфер. |
pbackfail | Защищенная виртуальная функция-член, которая пытается поместить элемент обратно во входной поток, а затем делает его текущим (на него указывает следующий указатель). |
pcount | Возвращает число элементов, записанных в управляемую последовательность. |
seekoff | Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков. |
seekpos | Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков. |
str | Вызывает freeze, затем возвращает указатель на начало управляемой последовательности. |
underflow | Защищенная виртуальная функция для извлечения текущего элемента из входного потока. |
Требования
Заголовок:<strstream>
Пространство имен: std
strstreambuf::freeze
Делает буфер потока недоступным для операций с буфером потока.
void freeze(bool _Freezeit = true);
Параметры
_Freezeit
Объект bool
, указывающий, следует ли фиксировать поток.
Замечания
Если _Freezeit имеет значение true, функция изменяет хранимый strstreambuf
режим, чтобы заморозить контролируемую последовательность. В противном случае управляемая последовательность зафиксирована не будет.
str подразумевает freeze
.
Примечание.
Замороженные буферы не будут освобождены во время уничтожения strstreambuf
. Необходимо отменить фиксацию буфера до освобождения, чтобы избежать утечки памяти.
Пример
// strstreambuf_freeze.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
void report(strstream &x)
{
if (!x.good())
cout << "stream bad" << endl;
else
cout << "stream good" << endl;
}
int main()
{
strstream x;
x << "test1";
cout << "before freeze: ";
report(x);
// Calling str freezes stream.
cout.write(x.rdbuf()->str(), 5) << endl;
cout << "after freeze: ";
report(x);
// Stream is bad now, wrote on frozen stream
x << "test1.5";
cout << "after write to frozen stream: ";
report(x);
// Unfreeze stream, but it is still bad
x.rdbuf()->freeze(false);
cout << "after unfreezing stream: ";
report(x);
// Clear stream
x.clear();
cout << "after clearing stream: ";
report(x);
x << "test3";
cout.write(x.rdbuf()->str(), 10) << endl;
// Clean up. Failure to unfreeze stream will cause a
// memory leak.
x.rdbuf()->freeze(false);
}
before freeze: stream good
test1
after freeze: stream good
after write to frozen stream: stream bad
after unfreezing stream: stream bad
after clearing stream: stream good
test1test3
strstreambuf::overflow
Защищенная виртуальная функция, которая может вызываться при вставке нового символа в полный буфер.
virtual int overflow(int _Meta = EOF);
Параметры
_Мета
Символ для вставки в буфер или EOF
.
Возвращаемое значение
Если функции не удалось выполниться успешно, возвращается значение EOF
. В противном случае, если _MetaEOF
== , он возвращает некоторое значение, отличное от .EOF
В противном случае возвращается _Meta.
Замечания
Если _Meta != EOF
, защищенная виртуальная функция-член пытается вставить элемент (char)_Meta
в выходной буфер. Для этого существует несколько способов.
Если позиция записи доступна, можно сохранить элемент в позиции записи и увеличить следующий указатель для выходного буфера.
Если сохраненный режим strstreambuf указывает, что управляемая последовательность доступна для изменения и расширения и не зафиксирована, функция может сделать позицию записи доступной, выделив новую позицию для выходного буфера. Расширение выходного буфера таким способом также расширяет любой связанный входной буфер.
strstreambuf::p backfail
Защищенная виртуальная функция-член, которая пытается поместить элемент обратно во входной поток, а затем делает его текущим (на него указывает следующий указатель).
virtual int pbackfail(int _Meta = EOF);
Параметры
_Мета
Символ для вставки в буфер или EOF
.
Возвращаемое значение
Если функции не удалось выполниться успешно, возвращается значение EOF
. В противном случае, если _MetaEOF
== , он возвращает некоторое значение, отличное от .EOF
В противном случае возвращается _Meta.
Замечания
Защищенная виртуальная функция-член пытается поместить элемент обратно во входной буфер, а затем делает его текущим (на него указывает следующий указатель).
Если _Meta == EOF
, элемент для отката фактически является тем, который уже находится в потоке до текущего элемента. В противном случае этот элемент заменяется ch = (char)_Meta
. Функция может передать элемент обратно различными способами.
Если положение обратного размещения доступно, и элемент, хранящийся там, сравнивается с
ch
равным, он может уменьшать следующий указатель для входного буфера.Если положение обратного размещения доступно, и если режим strstreambuf говорит, что управляемая последовательность модификируется, функция может храниться
ch
в позиции обратного размещения и уменьшать следующий указатель для входного буфера.
strstreambuf::p count
Возвращает число элементов, записанных в управляемую последовательность.
streamsize pcount() const;
Возвращаемое значение
Число элементов, записанных в управляемую последовательность.
Замечания
В частности, если pptr является пустым указателем, функция возвращает нуль. В противном случае возвращается pptr
- pbase.
Пример
// strstreambuf_pcount.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
int main( )
{
strstream x;
x << "test1";
cout << x.rdbuf( )->pcount( ) << endl;
x << "test2";
cout << x.rdbuf( )->pcount( ) << endl;
}
strstreambuf::seekoff
Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков.
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_От
Позиция, требуемая относительно _Way.
_Способ
Начальная точка для операций смещения. Возможные значения см. в разделе seekdir.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Если функция успешно изменила одну или обе позиции потока, то она возвращает итоговую позицию потока. В противном случае она завершается неудачно и возвращает недопустимую позицию потока.
Замечания
Защищенная виртуальная функция-член пытается изменить текущие положения для управляемых потоков. Для объекта класса strstreambuf позиция потока состоит исключительно из смещения потока. Нулевое смещение обозначает первый элемент управляемой последовательности.
Новая позиция определяется следующим образом.
Если
_Way == ios_base::beg
новая позиция — начало потока плюс _Off.Если
_Way == ios_base::cur
новая позиция — текущая позиция потока плюс _Off.Если
_Way == ios_base::end
новая позиция — конец потока плюс _Off.
Если _Which & ios_base::in
ненулевое значение и входной буфер существует, функция изменяет следующую позицию для чтения в входном буфере. Если _Which & ios_base::out
также ненулевое значение, _Way != ios_base::cur
а выходной буфер существует, функция также задает следующую позицию для записи, чтобы соответствовать следующей позиции для чтения.
В противном случае, если _Which & ios_base::out
имеет ненулевое значение и выходной буфер существует, функция меняет следующую позицию для записи в выходном буфере. В противном случае операция размещения завершается сбоем. Для успешного выполнения операции размещения итоговая позиция потока должна находиться в управляемой последовательности.
strstreambuf::seekpos
Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков.
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_Sp
Позиция для поиска.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Если функция успешно изменила одну или обе позиции потока, то она возвращает итоговую позицию потока. В противном случае она завершается неудачно и возвращает недопустимую позицию потока. Чтобы определить, является ли позиция потока недопустимой, сравните возвращаемое значение с pos_type(off_type(-1))
.
Замечания
Защищенная виртуальная функция-член пытается изменить текущие положения для управляемых потоков. Для объекта класса strstreambuf позиция потока состоит исключительно из смещения потока. Нулевое смещение обозначает первый элемент управляемой последовательности. Новая позиция определяется _Sp.
Если _Which
& ios_base::in ненулевого и входной буфер существует, функция изменяет следующую позицию для чтения в входном буфере. Если _Which
и ненулевое ios_base::out
значение, а выходной буфер существует, функция также задает следующую позицию для записи, чтобы соответствовать следующей позиции для чтения. В противном случае, если _Which
ненулевой и ios_base::out
выходной буфер существует, функция изменяет следующую позицию для записи в выходном буфере. В противном случае операция размещения завершается сбоем. Для успешного выполнения операции размещения итоговая позиция потока должна находиться в управляемой последовательности.
strstreambuf::str
Вызывает freeze, затем возвращает указатель на начало управляемой последовательности.
char *str();
Возвращаемое значение
Указатель на начало управляемой последовательности.
Замечания
Завершающий элемент null не существует, если явно его не вставить.
Пример
Пример использования str см. в разделе strstreambuf::freeze.
strstreambuf::strstreambuf
Создает объект типа strstreambuf
.
explicit strstreambuf(streamsize count = 0);
strstreambuf(void (* alloc_func)(size_t),
void (* free_func)(void*));
strstreambuf(char* getptr,
streamsize count,
char* putptr = 0);
strstreambuf(signed char* getptr,
streamsize count,
signed char* putptr = 0);
strstreambuf(unsigned char* getptr,
streamsize count,
unsigned char* putptr = 0);
strstreambuf(const char* getptr,
streamsize count);
strstreambuf(const signed char* getptr,
streamsize count);
strstreambuf(const unsigned char* getptr,
streamsize count);
Параметры
alloc_func
Функция, используемая для выделения памяти буфера.
count
Определяет длину буфера, на который указывает getptr. Если getptr не является аргументом (первая форма конструктора), рекомендуемый размер выделения буферов.
_Freefunc
Функция, используемая для освобождения памяти буфера.
getptr
Буфер, используемый для ввода.
putptr
Буфер, используемый для вывода.
Замечания
Первый конструктор сохраняет пустой указатель во всех указателях, управляющих входным и выходным буферами, а также распределением strstreambuf. Он задает сохраненный режим strstreambuf, чтобы сделать управляемую последовательность доступной для изменения и расширения. Он также принимает число в качестве предлагаемого начального размера выделения.
Второй конструктор работает как первый, за исключением того, что он сохраняет alloc_func в качестве указателя на функцию, чтобы вызвать выделение хранилища и free_func в качестве указателя на функцию, чтобы вызвать это хранилище.
Три конструктора:
strstreambuf(char *getptr,
streamsize count,
char *putptr = 0);
strstreambuf(signed char *getptr,
streamsize count,
signed char *putptr = 0);
strstreambuf(unsigned char *getptr,
streamsize count,
unsigned char *putptr = 0);
также ведет себя как первое, за исключением того, что getptr назначает объект массива, используемый для хранения управляемой последовательности. (Следовательно, он не должен быть пустым указателем.) Число элементов N в массиве определяется следующим образом:
Если (число> 0), то N — число.
Если (count == 0), то N —
strlen((const char *) getptr )
.Если (число< 0), то N — INT_MAX.
Если putptr является пустым указателем, функция устанавливает только входной буфер путем выполнения:
setg(getptr,
getptr,
getptr + N);
В противном случае она устанавливает и входной, и выходной буферы, выполняя следующее.
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
В этом случае putptr должен находиться в интервале [getptr, getptr + N].
Наконец, три конструктора:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
все ведут себя так же как:
streambuf((char *)getptr, count);
за исключением того, что хранимый режим делает управляемую последовательность недоступной для изменения или расширения.
strstreambuf::underflow
Защищенная виртуальная функция для извлечения текущего элемента из входного потока.
virtual int underflow();
Возвращаемое значение
Если функции не удалось выполниться успешно, возвращается значение EOF
. В противном случае она возвращает текущий элемент во входном потоке, преобразованный, как описано выше.
Замечания
Функция защищенного виртуального члена пытается извлечь текущий элемент ch
из входного буфера, а затем перейти к текущей позиции потока и вернуть элемент как (int)(unsigned char)ch
. Это можно сделать только одним способом: если доступно положение чтения, он принимает ch
в качестве элемента, хранящегося в позиции чтения, и перемещает следующий указатель для входного буфера.
См. также
streambuf
Потокобезопасность в стандартной библиотеке C++
Программирование iostream
Соглашения iostreams