Classe strstreambuf
Descreve um buffer de fluxo que controla a transmissão de elementos em uma sequência de elementos armazenados em um char
objeto de matriz.
Sintaxe
class strstreambuf : public streambuf
Comentários
Dependendo de como o objeto é construído, ele pode ser alocado, estendido e liberado conforme necessário para acomodar alterações na sequência.
Um objeto da classe strstreambuf
armazena vários bits de informações sobre o modo conforme o modo strstreambuf
. Esses bits indicam se a sequência controlada:
Foi alocada e precisa ser eventualmente liberada.
É modificável.
É extensível, realocando armazenamento.
Foi congelada e, portanto, precisa ser descongelado antes que o objeto é destruído ou liberado (se alocados) por uma agência diferente do objeto.
Uma sequência controlada que é congelada não pode ser modificada ou estendida, independentemente do estado desses bits de modo separado.
O objeto também armazena ponteiros para as duas funções que controlam strstreambuf
alocação. Se eles forem ponteiros nulos, o objeto desenvolve seu próprio método de alocar e liberar o armazenamento para a sequência controlada.
Observação
Essa classe foi preterida. Considere o uso de stringbuf ou wstringbuf, em vez disso.
Construtores
Construtor | Descrição |
---|---|
strstreambuf | Constrói um objeto do tipo strstreambuf . |
Funções de membro
Função de membro | Descrição |
---|---|
freeze | Faz com que um buffer de fluxo esteja indisponível por meio de operações de buffer de fluxo. |
overflow | Uma função virtual protegida que pode ser chamada quando um novo caractere é inserido em um buffer cheio. |
pbackfail | Uma função de membro virtual protegida que tenta colocar um elemento de volta no fluxo de entrada, então torná-lo elemento atual (apontando para o ponteiro seguinte). |
pcount | Retorna uma contagem do número de elementos gravados na sequência controlada. |
seekoff | Uma função de membro virtual protegida que tenta alterar as posições atuais para os fluxos controlados. |
seekpos | Uma função de membro virtual protegida que tenta alterar as posições atuais para os fluxos controlados. |
str | Chama freeze e retorna um ponteiro para o início da sequência controlada. |
underflow | Uma função virtual protegida para extrair o elemento atual do fluxo de entrada. |
Requisitos
Cabeçalho:<strstream>
Namespace: std
strstreambuf::congelar
Faz com que um buffer de fluxo esteja indisponível por meio de operações de buffer de fluxo.
void freeze(bool _Freezeit = true);
Parâmetros
_Freezeit
Um bool
que indica se você deseja que o fluxo seja congelado.
Comentários
Se _Freezeit for verdadeira, a função altera o modo strstreambuf
armazenado para tornar a sequência controlada congelada. Caso contrário, torna a sequência controlada não congelada.
str implica freeze
.
Observação
Um buffer congelado não será liberado durante strstreambuf
destruição. Será necessário descongelar o buffer antes que ele seja liberado para evitar um vazamento de memória.
Exemplo
// 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::estouro
Uma função virtual protegida que pode ser chamada quando um novo caractere é inserido em um buffer cheio.
virtual int overflow(int _Meta = EOF);
Parâmetros
_Meta
O caractere a ser inserido no buffer ou EOF
.
Valor de retorno
Se a função não conseguir obter êxito, ela retornará EOF
. Caso contrário, se _Meta == EOF
, ele retorna um valor diferente de EOF
. Caso contrário, retornará _Meta.
Comentários
Se _Meta != EOF
, a função de membro virtual protegida tenta inserir o elemento (char)_Meta
no buffer de saída. Isso pode ser feito de várias maneiras:
Se houver uma posição de gravação disponível, ela poderá armazenar o elemento na posição de gravação e incrementar o próximo ponteiro para o buffer de saída.
Se o modo de strstreambuf armazenado diz que a sequência controlada é modificável, extensível e não congelada, a função pode disponibilizar uma posição de gravação ao alocar novos para o buffer de saída. Estender o buffer de saída dessa forma também estende qualquer buffer de entrada associado.
strstreambuf::p backfail
Uma função de membro virtual protegida que tenta colocar um elemento de volta no fluxo de entrada, então torná-lo elemento atual (apontando para o ponteiro seguinte).
virtual int pbackfail(int _Meta = EOF);
Parâmetros
_Meta
O caractere a ser inserido no buffer ou EOF
.
Valor de retorno
Se a função não conseguir obter êxito, ela retornará EOF
. Caso contrário, se _Meta == EOF
, ele retorna um valor diferente de EOF
. Caso contrário, retornará _Meta.
Comentários
A função membro virtual protegida tenta colocar um elemento de volta no buffer de entrada e, em seguida, faz com que ele seja o elemento atual (apontado pelo próximo ponteiro).
Se _Meta == EOF
, o elemento a ser recuado é efetivamente o que já está no fluxo antes do elemento atual. Caso contrário, esse elemento será substituído por ch = (char)_Meta
. A função pode colocar um elemento de volta de várias maneiras:
Se uma posição putback estiver disponível e o elemento armazenado lá for comparável a
ch
, ele pode diminuir o próximo ponteiro para o buffer de entrada.Se uma posição putback está disponível e se o modo de strstreambuf diz a sequência controlada pode ser modificada, a função pode armazenar
ch
na posição de putback e diminuir o próximo ponteiro para o buffer de entrada.
strstreambuf::p count
Retorna uma contagem do número de elementos gravados na sequência controlada.
streamsize pcount() const;
Valor de retorno
Uma contagem do número de elementos gravados na sequência controlada.
Comentários
Especificamente, se pptr é um ponteiro nulo, a função retorna zero. Caso contrário, retornará pptr
- pbase.
Exemplo
// 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
Uma função de membro virtual protegida que tenta alterar as posições atuais para os fluxos controlados.
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parâmetros
_Off
A posição a ser buscada para o relativo a _Way.
_Way
O ponto de partida para operações de deslocamento. Consulte seekdir para valores possíveis.
_Which
Especifica o modo para a posição do ponteiro. O padrão é permitir que você modifique as posições de leitura e gravação.
Valor de retorno
Se a função tiver êxito na alteração de uma ou de ambas as posições de fluxo, ela retornará a posição do fluxo resultante. Caso contrário, ela falhará e retornará uma posição de fluxo inválida.
Comentários
A função de membro virtual protegida busca alterar as posições atuais para os fluxos controlados. Para um objeto da classe strstreambuf, uma posição de fluxo consiste em apenas um deslocamento de fluxo. O deslocamento zero designa o primeiro elemento da sequência controlada.
A nova posição é determinada da seguinte forma:
Se
_Way == ios_base::beg
, a nova posição será o início do fluxo mais _Off.Se
_Way == ios_base::cur
, a nova posição será a posição atual do fluxo mais _ Off.Se
_Way == ios_base::end
, a nova posição será o final do fluxo mais _Off.
Se _Which & ios_base::in
for diferente de zero e o buffer de entrada existir, a função altera a próxima posição de leitura no buffer de entrada. Se _Which & ios_base::out
também for diferente de zero, _Way != ios_base::cur
, e o buffer de saída existir, a função também define a próxima posição de gravação coincidir com a próxima posição de leitura.
Caso contrário, se _Which & ios_base::out
é diferente de zero e o buffer de saída existir, a função altera a próxima posição de gravação no buffer de saída. Caso contrário, a operação de posicionamento falhará. Para que uma operação de posicionamento seja bem-sucedida, a posição do fluxo resultante deve estar dentro da sequência controlada.
strstreambuf::seekpos
Uma função de membro virtual protegida que tenta alterar as posições atuais para os fluxos controlados.
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Parâmetros
_Sp
A posição pela qual buscar.
_Which
Especifica o modo para a posição do ponteiro. O padrão é permitir que você modifique as posições de leitura e gravação.
Valor de retorno
Se a função tiver êxito na alteração de uma ou de ambas as posições de fluxo, ela retornará a posição do fluxo resultante. Caso contrário, ela falhará e retornará uma posição de fluxo inválida. Para determinar se a posição de fluxo é inválida, compare o valor retornado com pos_type(off_type(-1))
.
Comentários
A função de membro virtual protegida busca alterar as posições atuais para os fluxos controlados. Para um objeto da classe strstreambuf, uma posição de fluxo consiste em apenas um deslocamento de fluxo. O deslocamento zero designa o primeiro elemento da sequência controlada. A nova posição é determinada por _Sp.
Se _Which
& ios_base::in for diferente de zero e o buffer de entrada existir, a função alterará a próxima posição para ler no buffer de entrada. Se _Which
& ios_base::out
for diferente de zero e o buffer de saída existir, a função também definirá a próxima posição a ser gravada para corresponder à próxima posição a ser lida. Caso contrário, se _Which
& ios_base::out
for diferente de zero e o buffer de saída existir, a função alterará a próxima posição para gravar no buffer de saída. Caso contrário, a operação de posicionamento falhará. Para que uma operação de posicionamento seja bem-sucedida, a posição do fluxo resultante deve estar dentro da sequência controlada.
strstreambuf::str
Chama freeze e retorna um ponteiro para o início da sequência controlada.
char *str();
Valor de retorno
Um ponteiro para o início da sequência controlada.
Comentários
Nenhum elemento nulo de terminação existe, a menos que você insira um explicitamente.
Exemplo
Consulte strstreambuf::freeze para ver uma amostra que usa str.
strstreambuf::strstreambuf
Constrói um objeto do tipo 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);
Parâmetros
alloc_func
A função usada para alocar memória do buffer.
count
Determina o comprimento do buffer apontado por getptr. Se getptr não é um argumento (primeira forma do construtor), uma alocação sugerida de tamanho para os buffers.
_Freefunc
A função usada para liberar memória do buffer.
getptr
Um buffer usado para a entrada.
putptr
Um buffer usado para a saída.
Comentários
O primeiro construtor armazena um ponteiro nulo em todos os ponteiros controlando o buffer de entrada, o buffer de saída e a alocação strstreambuf. Ele define o modo de strstreambuf armazenado para tornar a sequência controlada modificável e extensível. Também aceita count como um tamanho de alocação inicial sugerida.
O segundo construtor se comporta como o primeiro, exceto que ele armazena alloc_func como o ponteiro para a função a ser chamada para alocar o armazenamento e free_func como o ponteiro para a função a ser chamada para liberar o armazenamento.
Os três construtores:
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);
também se comportam como o primeiro, exceto que getptr designa o objeto de matriz usado para manter a sequência controlada. (Portanto, não deve ser um ponteiro nulo.) O número de elementos N na matriz é determinado da seguinte maneira:
Se (count> 0), então N é count.
Se (count == 0), então N é
strlen((const char *) getptr )
.Se (count< 0), então N é INT_MAX.
Se putptr for um ponteiro nulo, a função estabelece apenas um buffer de entrada, executando:
setg(getptr,
getptr,
getptr + N);
Caso contrário, ele estabelece os buffers de entrada e saída, executando:
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
Neste caso, putptr deve estar no intervalo [ getptr, getptr + N].
Finalmente, os três construtores:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
todos se comportam da mesma maneira, como:
streambuf((char *)getptr, count);
exceto pelo fato que o modo armazenado não torna a sequência controlada modificável ou extensível.
strstreambuf::underflow
Uma função virtual protegida para extrair o elemento atual do fluxo de entrada.
virtual int underflow();
Valor de retorno
Se a função não conseguir obter êxito, ela retornará EOF
. Caso contrário, retorna o elemento atual no fluxo de entrada, convertido conforme descrito acima.
Comentários
A função de membro virtual protegida se empenha para extrair o elemento atual ch
do buffer de entrada, em seguida, avança para posição atual do fluxo e retorna o elemento como (int)(unsigned char)ch
. Pode fazer isso apenas de uma maneira: se houver uma posição de leitura estiver disponível, ela pegará ch
como o elemento armazenado na posição leitura e avançará o próximo ponteiro para o buffer de entrada.
Confira também
streambuf
Acesso Thread-Safe na Biblioteca Padrão C++
Programação de iostream
Convenções de iostreams