basic_filebuf (Clase)

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Describe un búfer de secuencia que controla la transmisión de elementos de tipo Elem, cuyos rasgos de caracteres están determinados por la clase Tr, a y desde una secuencia de elementos almacenados en un archivo externo.

template <class Elem, class Tr = char_traits<Elem>>  
class basic_filebuf : public basic_streambuf<Elem, Tr>  

Parámetros

Elem
Elemento básico del búfer del archivo.

Tr
Los rasgos del elemento básico del búfer del archivo (normalmente char_traits < Elem>).

La clase de plantilla describe un búfer de secuencia que controla la transmisión de elementos de tipo Elem, cuyos rasgos de caracteres están determinados por la clase Tr, a y desde una secuencia de elementos almacenados en un archivo externo.

System_CAPS_ICON_note.jpg Nota

Los objetos de tipo basic_filebuf se crean con un búfer interno de tipo char *, independientemente del char_type especificado por el parámetro de tipo Elem. Esto significa que una cadena Unicode (que contiene caracteres wchar_t) se convertirá en una cadena ANSI (que contiene caracteres char) antes de que se escriba en el búfer interno. Para almacenar cadenas Unicode en el búfer, cree un nuevo búfer de tipo wchar_t y establecerlo mediante el basic_streambuf:: pubsetbuf () método. Para ver un ejemplo que muestra este comportamiento, vea a continuación.

Un objeto de clase basic_filebuf < Elem, Tr> almacena un puntero de archivo, que designa el FILE objeto que controla la secuencia asociada a un archivo abierto. También almacena punteros a dos facetas de conversión de archivo para su uso por las funciones de miembro protegido desbordamiento y subdesbordamiento. Para obtener más información, consulte basic_filebuf:: Open.

En el ejemplo siguiente se muestra cómo forzar un objeto de tipo basic_filebuf<wchar_t> para almacenar caracteres Unicode en su búfer interno mediante una llamada al método pubsetbuf().

// unicode_basic_filebuf.cpp  
// compile with: /EHsc  
  
#include <iostream>  
#include <string>  
#include <fstream>  
#include <iomanip>  
#include <memory.h>  
#include <string.h>  
  
#define IBUFSIZE 16  
  
using namespace std;  
  
void hexdump(const string& filename);  
  
int main()  
{  
    wchar_t* wszHello = L"Hello World";  
    wchar_t wBuffer[128];  
  
    basic_filebuf<wchar_t> wOutFile;  
  
    // Open a file, wcHello.txt, then write to it, then dump the  
    // file's contents in hex  
    wOutFile.open("wcHello.txt",  
        ios_base::out | ios_base::trunc | ios_base::binary);  
    if(!wOutFile.is_open())  
    {  
        cout << "Error Opening wcHello.txt\n";  
        return -1;  
    }  
    wOutFile.sputn(wszHello, (streamsize)wcslen(wszHello));  
    wOutFile.close();  
    cout << "Hex Dump of wcHello.txt - note that output is ANSI chars:\n";  
    hexdump(string("wcHello.txt"));  
  
    // Open a file, wwHello.txt, then set the internal buffer of  
    // the basic_filebuf object to be of type wchar_t, then write  
    // to the file and dump the file's contents in hex  
    wOutFile.open("wwHello.txt",  
        ios_base::out | ios_base::trunc | ios_base::binary);  
    if(!wOutFile.is_open())  
    {  
        cout << "Error Opening wwHello.txt\n";  
        return -1;  
    }  
    wOutFile.pubsetbuf(wBuffer, (streamsize)128);  
    wOutFile.sputn(wszHello, (streamsize)wcslen(wszHello));  
    wOutFile.close();  
    cout << "\nHex Dump of wwHello.txt - note that output is wchar_t chars:\n";  
    hexdump(string("wwHello.txt"));  
  
    return 0;  
}  
  
// dump contents of filename to stdout in hex  
void hexdump(const string& filename)  
{  
    fstream ifile(filename.c_str(),  
        ios_base::in | ios_base::binary);  
    char *ibuff = new char[IBUFSIZE];  
    char *obuff = new char[(IBUFSIZE*2)+1];  
    int i;  
  
    if(!ifile.is_open())  
    {  
        cout << "Cannot Open " << filename.c_str()  
             << " for reading\n";  
        return;  
    }  
    if(!ibuff || !obuff)  
    {  
        cout << "Cannot Allocate buffers\n";  
        ifile.close();  
        return;  
    }  
  
    while(!ifile.eof())  
    {  
        memset(obuff,0,(IBUFSIZE*2)+1);  
        memset(ibuff,0,IBUFSIZE);  
        ifile.read(ibuff,IBUFSIZE);  
  
        // corner case where file is exactly a multiple of  
        // 16 bytes in length  
        if(ibuff[0] == 0 && ifile.eof())  
            break;  
  
        for(i = 0; i < IBUFSIZE; i++)  
        {  
            if(ibuff[i] >= ' ')  
                obuff[i] = ibuff[i];  
            else  
                obuff[i] = '.';  
  
            cout << setfill('0') << setw(2) << hex  
                 << (int)ibuff[i] << ' ';  
        }  
        cout << "  " << obuff << endl;  
    }  
    ifile.close();  
}  

Hex Dump of wcHello.txt - note that output is ANSI chars:  
48 65 6c 6c 6f 20 57 6f 72 6c 64 00 00 00 00 00   Hello World.....  
  
Hex Dump of wwHello.txt - note that output is wchar_t chars:  
48 00 65 00 6c 00 6c 00 6f 00 20 00 57 00 6f 00   H.e.l.l.o. .W.o.  
72 00 6c 00 64 00 00 00 00 00 00 00 00 00 00 00   r.l.d...........  

Constructores

basic_filebufConstruye un objeto de tipo basic_filebuf.

Definiciones de tipo

char_typeAsocia un nombre de tipo con el parámetro de plantilla Elem.
int_typeHace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr.
off_typeHace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr.
pos_typeHace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr.
traits_typeAsocia un nombre de tipo con el parámetro de plantilla Tr.

Funciones miembro

CerrarCierra un archivo.
is_openIndica si un archivo está abierto.
abrirAbre un archivo.
desbordamientoFunción virtual protegida a la que se puede llamar cuando se inserta un carácter nuevo en un búfer lleno.
pbackfailLa función miembro virtual protegida intenta colocar un elemento en el flujo de entrada y, a continuación, convertirlo en el elemento actual (indicado por el puntero siguiente).
seekoffLa función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas.
seekposLa función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas.
setbufLa función miembro virtual protegida realiza una determinada operación para cada búfer de secuencia derivado.
IntercambioIntercambia el contenido de basic_filebuf por el contenido del parámetro basic_filebuf proporcionado.
sincronizaciónFunción virtual protegida que intenta sincronizar las secuencias controladas con cualquier flujo externo asociado.
uflowFunción virtual protegida que extrae el elemento actual de la secuencia de entrada.
subdesbordamientoFunción virtual protegida que extrae el elemento actual de la secuencia de entrada.

Encabezado:<>>

Espacio de nombres: std

Construye un objeto de tipo basic_filebuf.

basic_filebuf();

basic_filebuf(basic_filebuf&& right);

Comentarios

El primer constructor almacena un puntero null en todos los punteros de control del búfer de entrada y el búfer de salida. También se almacena un puntero nulo en el puntero de archivo.

El segundo constructor inicializa el objeto con el contenido de right, trata como una referencia rvalue.

Asocia un nombre de tipo con el Elem parámetro de plantilla.

typedef Elem char_type;  

Cierra un archivo.

basic_filebuf<Elem, Tr> *close();

Valor devuelto

La función miembro devuelve un puntero nulo si el puntero de archivo es un puntero nulo.

Comentarios

close calls fclose( fp). Si esta función devuelve un valor distinto de cero, la función devuelve un puntero nulo. De lo contrario, devuelve esto para indicar que el archivo se ha cerrado correctamente.

Para una secuencia amplia, si las inserciones se han producido desde que se abrió la secuencia o desde la última llamada a streampos, las llamadas de función desbordamiento. También inserta cualquier secuencia necesaria para restaurar el estado de la conversión inicial, utilizando la faceta de conversión de archivo servicio para llamar a fac.unshift según sea necesario. Cada elemento bytes de tipo char editadas se escribe en la secuencia asociada designada por el puntero de archivo fp como si por llamadas sucesivas del formulario fputc( bytes, fp). Si la llamada a fac.unshift o cualquier escritura que se produce un error, la función no se realiza correctamente.

Ejemplo

En el ejemplo siguiente se supone dos archivos en el directorio actual: basic_filebuf_close.txt (el contenido es "prueba") y iotest.txt (contenido es "ssss").

// basic_filebuf_close.cpp  
// compile with: /EHsc  
#include <fstream>  
#include <iostream>  
  
int main() {  
   using namespace std;  
   ifstream file;  
   basic_ifstream <wchar_t> wfile;  
   char c;  
   // Open and close with a basic_filebuf  
   file.rdbuf()->open( "basic_filebuf_close.txt", ios::in );  
   file >> c;  
   cout << c << endl;  
   file.rdbuf( )->close( );  
  
   // Open/close directly  
   file.open( "iotest.txt" );  
   file >> c;  
   cout << c << endl;  
   file.close( );  
  
   // open a file with a wide character name  
   wfile.open( L"iotest.txt" );  
  
   // Open and close a nonexistent with a basic_filebuf  
   file.rdbuf()->open( "ziotest.txt", ios::in );  
   cout << file.fail() << endl;  
   file.rdbuf( )->close( );  
  
   // Open/close directly  
   file.open( "ziotest.txt" );  
   cout << file.fail() << endl;  
   file.close( );  
}  

t  
s  
0  
1  

Convierte a este tipo dentro del ámbito del basic_filebuf equivalente al tipo del mismo nombre en el Tr ámbito.

typedef typename traits_type::int_type int_type;  

Indica si un archivo está abierto.

bool is_open() const;

Valor devuelto

True si el puntero de archivo no es un puntero nulo.

Ejemplo

// basic_filebuf_is_open.cpp  
// compile with: /EHsc  
#include <fstream>  
#include <iostream>  
  
int main( )   
{  
   using namespace std;  
   ifstream file;  
   cout << boolalpha << file.rdbuf( )->is_open( ) << endl;  
  
   file.open( "basic_filebuf_is_open.cpp" );  
   cout << file.rdbuf( )->is_open( ) << endl;  
}  

false  
true  

Convierte a este tipo dentro del ámbito del basic_filebuf equivalente al tipo del mismo nombre en el Tr ámbito.

typedef typename traits_type::off_type off_type;  

Abre un archivo.

basic_filebuf<Elem, Tr> *open(
    const char* _Filename,  
    ios_base::openmode _Mode,  
    int _Prot = (int)ios_base::_Openprot);

basic_filebuf<Elem, Tr> *open(
    const char* _Filename,  
    ios_base::openmode _Mode);

basic_filebuf<Elem, Tr> *open(
    const wchar_t* _Filename,  
    ios_base::openmode _Mode,  
    int _Prot = (int)ios_base::_Openprot);

basic_filebuf<Elem, Tr> *open(
    const wchar_t* _Filename,  
    ios_base::openmode _Mode);

Parámetros

_Filename
El nombre de archivo que desee abrir.

_Mode
Una de las enumeraciones en ios_base:: OpenMode.

_Prot
El archivo predeterminado, abra protección, equivalente a la shflag parámetro en _fsopen, _wfsopen.

Valor devuelto

Si el puntero de archivo es un puntero nulo, la función devuelve un puntero nulo. De lo contrario, devuelve esto.

Comentarios

La función miembro abre el archivo con el nombre de archivo nombre de archivo, llamando fopen( nombre de archivo, strmode). strmode se determina a partir modo aspecto~ ( ate aspecto | binary):

  • ios_base::in se convierte en "r" (abra el archivo existente para lectura).

  • ios_base::out o ios_base::out | ios_base::trunc se convierte en "w" (truncar el archivo existente o crear para escritura).

  • ios_base::out | aplicación se convierte en "a" (Abrir archivo existente para anexar todas las escrituras).

  • ios_base::in | ios_base::out se convierte en "r +" (abrir un archivo existente para lectura y escritura).

  • ios_base::in | ios_base::out | ios_base::trunc se convierte en "w +" (truncar el archivo existente o crear de lectura y escritura).

  • ios_base::in | ios_base::out | ios_base::App se convierte en "a +" (Abrir archivo existente para lectura y para anexar todas las escrituras).

Si modo aspecto ios_base::binary es distinto de cero, anexa de la función b a strmode para abrir una secuencia binaria en lugar de una secuencia de texto. A continuación, almacena el valor devuelto por fopen en el puntero de archivo fp. Si modo aspecto ios_base::ate es distinto de cero y el puntero de archivo no es un puntero nulo, las llamadas de función fseek( fp, 0, SEEK_END) para colocar la secuencia al final del archivo. Si esa posición operación produce un error, las llamadas de función cerrar( fp) y almacena un puntero nulo en el puntero de archivo.

Si el puntero de archivo no es un puntero nulo, la función determina el aspecto de la conversión de archivo: use_facet < codecvt < Elem, char, traits_type::state_type> > ( getloc), para su uso por subdesbordamiento y desbordamiento.

Si el puntero de archivo es un puntero nulo, la función devuelve un puntero nulo. De lo contrario, devuelve esto.

Ejemplo

Consulte basic_filebuf:: Close para obtener un ejemplo que utiliza abrir.

Asigna el contenido de este objeto de búfer de secuencia. Se trata de una asignación de movimiento que implica un valor R que no deja ninguna copia atrás.

basic_filebuf& operator=(basic_filebuf&& right);

Parámetros

right
Una referencia a valor r a una basic_filebuf objeto.

Valor devuelto

Devuelve *this.

Comentarios

El operador de miembro reemplaza el contenido del objeto por el contenido de right, que se trata como referencia rvalue. Para obtener más información, consulte declarador de referencia Rvalue: &&.

Se llama cuando se inserta un nuevo carácter en el búfer esté lleno.

virtual int_type overflow(int_type _Meta = traits_type::eof);

Parámetros

_Meta
El carácter que se va a insertar en el búfer o traits_type::eof.

Valor devuelto

Si la función no se ejecutará correctamente, devuelve traits_type::eof. De lo contrario, devuelve traits_type::not_eof(_ Meta).

Comentarios

Si _ Meta! = traits_type::eof, la función miembro virtual protegida intenta insertar el elemento ch = traits_type::to_char_type(_ Meta) en el búfer de salida. Puede hacerlo de varias maneras:

  • Si está disponible una posición de escritura, puede incrementar el puntero siguiente para el búfer de salida y almacenar el elemento en la posición de escritura.

  • Puede disponer de una posición de escritura mediante la asignación de almacenamiento nueva o adicional para el búfer de salida.

  • Puede convertir cualquier resultado pendiente en el búfer de salida, seguido de ch, utilizando la faceta de conversión de archivo servicio para llamar a fac.out según sea necesario. Cada elemento ch de tipo char editadas se escribe en la secuencia asociada designada por el puntero de archivo fp como si por llamadas sucesivas del formulario fputc( ch, fp). Si se produce un error en cualquier conversión o escritura, la función no tiene éxito.

Intenta vuelva a colocar un elemento en la secuencia de entrada y convertirlo en el elemento actual (indicado por el puntero siguiente).

virtual int_type pbackfail(int_type _Meta = traits_type::eof);

Parámetros

_Meta
El carácter que se va a insertar en el búfer o traits_type::eof.

Valor devuelto

Si la función no se ejecutará correctamente, devuelve traits_type::eof. De lo contrario, devuelve traits_type::not_eof(_ Meta).

Comentarios

La función miembro virtual protegida vuelve a colocar un elemento en el búfer de entrada y, a continuación, hace el elemento actual (indicado por el puntero siguiente). Si _ Meta == traits_type::eof, el elemento que se va a devolver es realmente ya en el flujo antes del elemento actual. De lo contrario, dicho elemento se sustituye por ch = traits_type::to_char_type(_ Meta). La función puede poner de nuevo un elemento de distintas maneras:

  • Si está disponible una posición de putback y el elemento almacenado es igual a ch, puede disminuir el puntero siguiente para el búfer de entrada.

  • Si la función puede hacer un putback posición disponible, puede hacerlo, establezca el siguiente puntero al punto en el que colocar y almacenar ch en esa posición.

  • Si la función puede devolver un elemento en la secuencia de entrada, puede hacerlo, por ejemplo, mediante una llamada a ungetc para un elemento de tipo char .

Convierte a este tipo dentro del ámbito del basic_filebuf equivalente al tipo del mismo nombre en el Tr ámbito.

typedef typename traits_type::pos_type pos_type;  

Intenta modificar las posiciones actuales de las secuencias controladas.

virtual pos_type seekoff(off_type _Off,
    ios_base::seekdir _Way,
    ios_base::openmode _Which = ios_base::in | ios_base::out);

Parámetros

_Off
La posición de búsqueda para relativa a _Way.

_Way
El punto de partida para las operaciones de desplazamiento. Consulte seekdir posibles valores.

_Which
Especifica el modo de la posición del puntero. El valor predeterminado es que le permite modificar la lectura y escritura posiciones.

Valor devuelto

Devuelve la nueva posición o la posición de una secuencia no válida.

Comentarios

La función miembro virtual protegida intenta modificar las posiciones actuales de las secuencias controladas. Para un objeto de clase basic_filebuf< Elem, Tr>, una posición de la secuencia puede representarse mediante un objeto de tipo fpos_t, que almacena un desplazamiento y cualquier información de estado que se necesita para analizar una secuencia amplia. Desplazamiento cero designa el primer elemento de la secuencia. (Un objeto de tipo pos_type almacena al menos un fpos_t objeto.)

Para un archivo abierto para lectura y escritura, las secuencias de entrada y salidas se colocan en tándem. Para cambiar entre la inserción y extracción, debe llamar pubseekoff o pubseekpos. Las llamadas a pubseekoff (y por tanto a seekoff) tienen varias limitaciones para secuencias de texto, secuencias binarias, y secuencias anchas.

Si el puntero de archivo fp es un puntero nulo, la función no. De lo contrario, intenta modificar la posición de la secuencia llamando a fseek( fp, _Off, _Way). Si dicha función se realiza correctamente y la posición resultante fposn se puede determinar mediante una llamada a fgetpos( fp, aspecto fposn), la función se realiza correctamente. Si la función se realiza correctamente, devuelve un valor de tipo pos_type con fposn. De lo contrario, devuelve la posición de una secuencia no válida.

Intenta modificar las posiciones actuales de las secuencias controladas.

virtual pos_type seekpos(pos_type _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);

Parámetros

_Sp
La posición de búsqueda para

_Which
Especifica el modo de la posición del puntero. El valor predeterminado es que le permite modificar la lectura y escritura posiciones.

Valor devuelto

Si el puntero de archivo fp es un puntero nulo, la función no. De lo contrario, intenta modificar la posición de la secuencia llamando a fsetpos( fp, aspecto fposn), donde fposn es el fpos_t objeto almacenado en pos. Si dicha función se realiza correctamente, la función devuelve pos. De lo contrario, devuelve la posición de una secuencia no válida. Para determinar si la posición de la secuencia no es válida, compare el valor devuelto con pos_type(off_type(-1)).

Comentarios

La función miembro virtual protegida intenta modificar las posiciones actuales de las secuencias controladas. Para un objeto de clase basic_filebuf< Elem, Tr>, una posición de la secuencia puede representarse mediante un objeto de tipo fpos_t, que almacena un desplazamiento y cualquier información de estado que se necesita para analizar una secuencia amplia. Desplazamiento cero designa el primer elemento de la secuencia. (Un objeto de tipo pos_type almacena al menos un fpos_t objeto.)

Para un archivo abierto para lectura y escritura, las secuencias de entrada y salidas se colocan en tándem. Para cambiar entre la inserción y extracción, debe llamar pubseekoff o pubseekpos. Las llamadas a pubseekoff (y, por tanto, para seekoff) tienen varias limitaciones para secuencias anchas, secuencias binarias y secuencias de texto.

Para una secuencia amplia, si las inserciones se han producido desde que se abrió la secuencia o desde la última llamada a streampos, las llamadas de función desbordamiento. También inserta cualquier secuencia necesaria para restaurar el estado de la conversión inicial, utilizando la faceta de conversión de archivo servicio para llamar a servicio .``unshift según sea necesario. Cada elemento bytes de tipo char editadas se escribe en la secuencia asociada designada por el puntero de archivo fp como si por llamadas sucesivas del formulario fputc( bytes, fp). Si la llamada a fac.unshift o cualquier escritura que se produce un error, la función no se realiza correctamente.

Realiza una determinada operación en cada búfer de secuencia derivada.

virtual basic_streambuf<Elem, Tr> *setbuf(
    char_type* _Buffer,  
    streamsize count);

Parámetros

_Buffer
Puntero a un búfer.

count
Tamaño del búfer.

Valor devuelto

La función miembro protegido devuelve cero si el puntero de archivo fp es un puntero nulo.

Comentarios

setbufllamadas setvbuf( fp, ( char *) _Buffer, _IOFBF, count * sizeof ( Elem)) para ofrecer la matriz de count elementos, empezando por _ búfer como un búfer de la secuencia. Si esta función devuelve un valor distinto de cero, la función devuelve un puntero nulo. De lo contrario, devuelve esto para el éxito de la señal.

Intercambia el contenido de este basic_filebuf por el contenido del basic_filebuf proporcionado.

void swap(basic_filebuf& right);

Parámetros

right
Referencia lvalue a otro basic_filebuf.

Intenta sincronizar las secuencias controladas con cualquier flujo externo asociado.

virtual int sync();

Valor devuelto

Devuelve cero si el puntero de archivo fp es un puntero nulo. De lo contrario, devuelve cero si solo llama a los métodos desbordamiento y fflush( fp) triunfar en Vaciar todos los resultados pendientes en la secuencia.

Asocia un nombre de tipo con el Tr parámetro de plantilla.

typedef Tr traits_type;  

Extrae el elemento actual de la secuencia de entrada.

virtual int_type underflow();

Valor devuelto

Si la función no se ejecutará correctamente, devuelve traits_type::eof. De lo contrario, devuelve ch, convertido como se describe en la sección Comentarios.

Comentarios

La función miembro virtual protegida intenta extraer el elemento actual ch de la entrada de secuencia y devolver el elemento como traits_type::to_int_type( ch). Puede hacerlo de varias maneras:

  • Si la posición de lectura está disponible, tarda ch como el elemento almacenado en la posición de lectura y hace avanzar el puntero siguiente para el búfer de entrada.

  • Puede leer uno o varios elementos de tipo char , como si por llamadas sucesivas del formulario fgetc( fp) y convertirlos a un elemento ch de tipo Elem utilizando el servicio de faceta de conversión de archivo para llamar a fac.in según sea necesario. Si se produce un error en cualquier lectura o la conversión, la función no tiene éxito.

<>>
Seguridad para subprocesos en la biblioteca estándar de C++
iostream de programación
Convenciones de iostreams

Mostrar: