basic_filebuf (Clase)
Describe un búfer de secuencia que controla la transmisión de elementos de tipo Char_T, cuyos rasgos de caracteres están determinados por la clase Tr, a y desde una secuencia de elementos almacenados en un archivo externo.
Sintaxis
template <class Char_T, class Tr = char_traits<Char_T>>
class basic_filebuf : public basic_streambuf<Char_T, Tr>
Parámetros
Char_T
Elemento básico del búfer del archivo.
Tr
Rasgos del elemento básico del búfer del archivo (normalmente char_traits<Char_T>
).
Comentarios
La plantilla de clase describe un búfer de secuencia que controla la transmisión de elementos de tipo Char_T, cuyos rasgos de caracteres están determinados por la clase Tr, a y desde una secuencia de elementos almacenados en un archivo externo.
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 Char_T. 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 establézcalo mediante el método basic_streambuf::pubsetbuf
()
. Para ver un ejemplo que muestra este comportamiento, vea a continuación.
Un objeto de clase basic_filebuf<Char_T, Tr>
almacena un puntero de archivo, que designa el objeto FILE
que controla el flujo asociado a un archivo abierto. También almacena punteros a dos facetas de conversión de archivo para su uso por parte de las funciones miembro protegidas overflow y underflow. Para obtener más información, vea basic_filebuf::open
.
Ejemplo
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
Constructor | Descripción |
---|---|
basic_filebuf | Construye un objeto de tipo basic_filebuf . |
Typedefs
Nombre de tipo | Descripción |
---|---|
char_type | Asocia un nombre de tipo con el parámetro de plantilla Char_T . |
int_type | Hace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr . |
off_type | Hace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr . |
pos_type | Hace que este tipo en el ámbito de basic_filebuf equivalga al tipo con el mismo nombre del ámbito Tr . |
traits_type | Asocia un nombre de tipo con el parámetro de plantilla Tr . |
Funciones miembro
Función de miembro | Descripción |
---|---|
close | Cierra un archivo. |
is_open | Indica si un archivo está abierto. |
open | Abre un archivo. |
overflow | Función virtual protegida a la que se puede llamar cuando se inserta un carácter nuevo en un búfer lleno. |
pbackfail | La 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). |
seekoff | La función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas. |
seekpos | La función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas. |
setbuf | La función miembro virtual protegida realiza una determinada operación para cada búfer de secuencia derivado. |
Swap | Intercambia el contenido de basic_filebuf por el contenido del parámetro basic_filebuf proporcionado. |
sync | Función virtual protegida que intenta sincronizar las secuencias controladas con cualquier flujo externo asociado. |
uflow | Función virtual protegida que extrae el elemento actual de la secuencia de entrada. |
underflow | Función virtual protegida que extrae el elemento actual de la secuencia de entrada. |
Requisitos
Encabezado:<fstream>
Espacio de nombres: std
basic_filebuf::basic_filebuf
Construye un objeto de tipo basic_filebuf
.
basic_filebuf();
basic_filebuf(basic_filebuf&& right);
Comentarios
El primer constructor almacena un puntero nulo en todos los punteros que controlan el búfer de entrada y el de salida. También almacena un puntero nulo en el puntero de archivo.
El segundo constructor inicializa el objeto con el contenido de right
, tratado como una referencia a un valor R.
basic_filebuf::char_type
Asocia un nombre de tipo con el parámetro de plantilla Char_T
.
typedef Char_T char_type;
basic_filebuf::close
Cierra un archivo.
basic_filebuf<Char_T, Tr> *close();
Valor devuelto
La función miembro devuelve un puntero nulo si el puntero de archivo es un puntero nulo.
Comentarios
close
llama a fclose(fp)
. Si esa función devuelve un valor distinto de cero, la función devuelve un puntero nulo. De lo contrario, devuelve this
para indicar que el archivo se ha cerrado correctamente.
En un flujo ancho, si se han producido inserciones desde la apertura del flujo o desde la última llamada a streampos
, la función llama a overflow
. Además se inserta cualquier secuencia necesaria para restaurar el estado de conversión inicial mediante la faceta de conversión de archivo fac
para llamar a fac.unshift
según sea necesario. Cada elemento byte
producido de tipo char
se escribe en el flujo asociado designado por el puntero de archivo fp
como si se hiciera mediante llamadas sucesivas del formato fputc(byte, fp)
. Si se produce un error en la llamada a fac.unshift
o en cualquier escritura, la función no se ejecuta correctamente.
Ejemplo
En el ejemplo siguiente se asume que hay dos archivos en el directorio actual: basic_filebuf_close.txt (el contenido es "testing") e iotest.txt (el 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
basic_filebuf::int_type
Hace que este tipo en el ámbito de basic_filebuf
equivalga al tipo con el mismo nombre del ámbito Tr
.
typedef typename traits_type::int_type int_type;
basic_filebuf::is_open
Indica si un archivo está abierto.
bool is_open() const;
Valor devuelto
true
si el puntero de archivo no es 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
basic_filebuf::off_type
Hace que este tipo en el ámbito de basic_filebuf
equivalga al tipo con el mismo nombre del ámbito Tr
.
typedef typename traits_type::off_type off_type;
basic_filebuf::open
Abre un archivo.
basic_filebuf<Char_T, Tr> *open(
const char* filename,
ios_base::openmode mode,
int protection = (int)ios_base::_Openprot);
basic_filebuf<Char_T, Tr> *open(
const char* filename,
ios_base::openmode mode);
basic_filebuf<Char_T, Tr> *open(
const wchar_t* filename,
ios_base::openmode mode,
int protection = (int)ios_base::_Openprot);
basic_filebuf<Char_T, Tr> *open(
const wchar_t* filename,
ios_base::openmode mode);
Parámetros
filename
Nombre del archivo que se va a abrir.
mode
Una de las enumeraciones de ios_base::openmode
.
protección
Protección predeterminada de apertura del archivo, equivalente al parámetroshflag en _fsopen, _wfsopen.
Valor devuelto
Si el búfer ya está abierto o si el puntero de archivo es un puntero nulo, la función devuelve un puntero nulo. De lo contrario, devuelve this
.
Comentarios
Esta función usa un FILE *
para volver a basic_filebuf
como si hubiera llamado a fopen/wfopen
(filename, strmode)
. strmode
se determina a partir de mode & ~(
)
ate
|
binary
:
ios_base::in
se convierte en"r"
(abra un archivo existente para lectura).- ios_base::out o
ios_base::out | ios_base::trunc
se convierte en"w"
(trunque el archivo existente o créelo para escritura). ios_base::out | app
se convierte en"a"
(abra archivo existente para anexar todas las escrituras).ios_base::in | ios_base::out
se convierte en"r+"
(abra un archivo existente para lectura y escritura).ios_base::in | ios_base::out | ios_base::trunc
se convierte en"w+"
(trunque el archivo existente o créelo para lectura y escritura).ios_base::in | ios_base::out | ios_base::app
se convierte en"a+"
(abra archivo existente para lectura para anexar todas las escrituras).
Si mode & ios_base::binary
es distinto de cero, la función anexa b
a strmode
para abrir un flujo binario en lugar de un flujo de texto.
Si mode & ios_base::ate
es distinto de cero y el archivo se abrió correctamente, la ubicación actual de la secuencia se coloca al final del archivo. Si se produce un error, el archivo se cierra.
Si las operaciones anteriores se completaron correctamente, la faceta de conversión de archivos se determina: use_facet<codecvt<Char_T, char, traits_type::
state_type
> >(
getloc
)
, para su uso por flujo y desbordamiento.
Si el archivo no se pudo abrir correctamente, se devuelve nullptr
.
Ejemplo
Consulte basic_filebuf::close
para ver un ejemplo en el que se usa open
.
basic_filebuf::operator=
Asigna el contenido de este objeto de búfer de secuencia. Se trata de una asignación de movimiento que implica un rvalue que no deja ninguna copia atrás.
basic_filebuf& operator=(basic_filebuf&& right);
Parámetros
right
Referencia a un valor R a un objeto basic_filebuf.
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 más información, vea Declarador de referencia a un valor R: &&.
basic_filebuf::overflow
Se llama cuando se inserta un nuevo carácter en un búfer 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 puede 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 almacenar el elemento en la posición de escritura e incrementar el puntero siguiente para el búfer de salida.
Puede proporcionar una posición de escritura al asignar almacenamiento nuevo o adicional para el búfer de salida.
Puede convertir cualquier salida pendiente en el búfer de salida, seguida de
ch
, mediante la faceta de conversión de archivofac
para llamar afac.out
según sea necesario. Cada elementoch
producido de tipo char se escribe en el flujo asociado designado por el puntero de archivofp
como si se hiciera mediante llamadas sucesivas del formatofputc(ch, fp)
. Si se produce un error en cualquier conversión o escritura, la función no se ejecuta correctamente.
basic_filebuf::p backfail
Intenta volver a colocar un elemento en el flujo de entrada y luego convertirlo en el elemento actual (al que apunta 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 puede 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 luego lo convierte en el elemento actual (al que apunta el siguiente puntero). Si _Meta == traits_type::
eof
, el elemento que se va a devolver es realmente el que ya está en el flujo por delante del elemento actual. De lo contrario, dicho elemento se sustituye por ch = traits_type::
to_char_type
(_Meta)
. La función puede devolver un elemento de distintas maneras:
Si hay disponible una posición
putback
y el elemento almacenado es igual ach
, puede disminuir el puntero siguiente para el búfer de entrada.Si la función puede conseguir que haya una posición
putback
disponible, puede hacerlo, establecer el siguiente puntero para que apunte a esa posición y almacenarch
en ella.Si la función puede insertar un elemento en el flujo de entrada, puede hacerlo, como llamando a
ungetc
para un elemento de tipochar
.
basic_filebuf::p os_type
Hace que este tipo en el ámbito de basic_filebuf
equivalga al tipo con el mismo nombre del ámbito Tr
.
typedef typename traits_type::pos_type pos_type;
basic_filebuf::seekoff
Intenta modificar las posiciones actuales de los flujos controlados.
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 que se va a buscar relativa a _Way.
_Way
El punto de partida de las operaciones de desplazamiento. Vea los valores posibles en seekdir.
_Which
Especifica el modo de la posición del puntero. El valor predeterminado es permitirle modificar las posiciones de lectura y escritura.
Valor devuelto
Devuelve la posición nueva o una posición de flujo no válida.
Comentarios
La función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas. Para un objeto de clase basic_filebuf
<Char_T, Tr>
, un objeto de tipo fpos_t
puede representar una posición del flujo, que almacena un desplazamiento y cualquier información de estado que se necesite para analizar un flujo ancho. El desplazamiento cero se refiere al primer elemento del flujo. (Un objeto de tipo pos_type
almacena al menos un objeto fpos_t
).
En el caso de un archivo abierto para lectura y escritura, los flujos de entrada y salida se colocan en tándem. Para cambiar entre inserción y extracción, debe llamar a pubseekoff
o a pubseekpos
. Las llamadas a pubseekoff
(y por tanto a seekoff
) tienen varias limitaciones para flujos de texto, flujos binarios y flujos anchos.
Si el puntero de archivo fp
es un puntero nulo, se produce un error al ejecutar la función. De lo contrario, intenta modificar la posición del flujo al llamar a fseek(fp, _Off, _Way)
. Si esa función se ejecuta correctamente y la posición resultante fposn
se puede determinar mediante una llamada a fgetpos(fp, &fposn)
, la función se ejecuta correctamente. Si la función se ejecuta correctamente, devuelve un valor de tipo pos_type
que contiene fposn
. De lo contrario, devuelve una posición de flujo no válida.
basic_filebuf::seekpos
Intenta modificar las posiciones actuales de los flujos controlados.
virtual pos_type seekpos(
pos_type _Sp,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parámetros
_Sp
La posición que se va a buscar.
_Which
Especifica el modo de la posición del puntero. El valor predeterminado es permitirle modificar las posiciones de lectura y escritura.
Valor devuelto
Si el puntero de archivo fp
es un puntero nulo, se produce un error al ejecutar la función. De lo contrario, intenta modificar la posición del flujo al llamar a fsetpos(fp, &fposn)
, donde fposn
es el objeto fpos_t
almacenado en pos
. Si esa función se ejecuta correctamente, la función devuelve pos
. De lo contrario, devuelve una posición de flujo no válida. Para determinar si la posición del flujo no es válida, compare el valor devuelto con pos_type(off_type(-1))
.
Comentarios
La función miembro virtual protegida trata de modificar las posiciones actuales de las secuencias controladas. Para un objeto de clase basic_filebuf
<Char_T, Tr>
, un objeto de tipo fpos_t
puede representar una posición del flujo, que almacena un desplazamiento y cualquier información de estado que se necesite para analizar un flujo ancho. El desplazamiento cero se refiere al primer elemento del flujo. (Un objeto de tipo pos_type
almacena al menos un objeto fpos_t
).
En el caso de un archivo abierto para lectura y escritura, los flujos de entrada y salida se colocan en tándem. Para cambiar entre inserción y extracción, debe llamar a pubseekoff
o a pubseekpos
. Las llamadas a pubseekoff
(y a seekoff
) tienen varias limitaciones para flujos de texto, flujos binarios y flujos anchos.
En un flujo ancho, si se han producido inserciones desde la apertura del flujo o desde la última llamada a streampos
, la función llama a overflow
. Además se inserta cualquier secuencia necesaria para restaurar el estado de conversión inicial mediante la faceta de conversión de archivo fac
para llamar a fac.unshift
según sea necesario. Cada elemento byte
producido de tipo char
se escribe en el flujo asociado designado por el puntero de archivo fp
como si se hiciera mediante llamadas sucesivas del formato fputc(byte, fp)
. Si se produce un error en la llamada a fac.unshift
o en cualquier escritura, la función no se ejecuta correctamente.
basic_filebuf::setbuf
Realiza una determinada operación para cada búfer de flujo derivado.
virtual basic_streambuf<Char_T, 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 protegida devuelve cero si el puntero de archivo fp
es un puntero nulo.
Comentarios
setbuf
llama a setvbuf( fp, (char*) _Buffer, _IOFBF, count * sizeof( Char_T))
para ofrecer la matriz de los elementos count
que empiezan en _Buffer como búfer de flujo. Si esa función devuelve un valor distinto de cero, la función devuelve un puntero nulo. De lo contrario, devuelve this
para señalar el éxito.
basic_filebuf::swap
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 un objeto basic_filebuf
.
basic_filebuf::sync
Intenta sincronizar los flujos controlados 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 solo si las llamadas a overflow y fflush(fp)
logran vaciar todas las salidas pendientes en el flujo.
basic_filebuf::traits_type
Asocia un nombre de tipo con el parámetro de plantilla Tr
.
typedef Tr traits_type;
basic_filebuf::underflow
Extrae el elemento actual del flujo de entrada.
virtual int_type underflow();
Valor devuelto
Si la función no se puede 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
del flujo de entrada y devolver el elemento como traits_type::
to_int_type
(ch)
. Puede hacerlo de varias maneras:
Si hay una posición de lectura disponible, toma
ch
como elemento almacenado en la posición de lectura y avanza el puntero siguiente del búfer de entrada.Puede leer uno o más elementos de tipo
char
, como si lo hiciera mediante llamadas sucesivas del formatofgetc(fp)
, y convertirlos en un elementoch
de tipoChar_T
mediante la faceta de conversión de archivofac
para llamar afac.in
según sea necesario. Si se produce un error en cualquier conversión o lectura, la función no se ejecuta correctamente.
Consulte también
<fstream>
Seguridad para subprocesos en la biblioteca estándar de C++
Programación con iostream
Convenciones de iostreams