Partilhar via


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