basic_filebuf, classe
Décrit une mémoire tampon de flux qui contrôle la transmission d’éléments de type Char_T, dont les caractéristiques de caractère sont déterminées par la classe Tr, vers et à partir d’une séquence d’éléments stockés dans un fichier externe.
Syntaxe
template <class Char_T, class Tr = char_traits<Char_T>>
class basic_filebuf : public basic_streambuf<Char_T, Tr>
Paramètres
Char_T
Élément de base de la mémoire tampon de fichier.
Tr
Caractéristiques de l’élément de base de la mémoire tampon de fichier (généralement char_traits<Char_T>
).
Notes
Le modèle de classe décrit une mémoire tampon de flux qui contrôle la transmission d’éléments de type Char_T, dont les caractéristiques de caractère sont déterminées par la classe Tr, vers et à partir d’une séquence d’éléments stockés dans un fichier externe.
Remarque
Les objets de type basic_filebuf
sont créés avec une mémoire tampon interne de type char* quel que soit le char_type
paramètre de type spécifié Char_T. Cela signifie qu'une chaîne Unicode (contenant des caractères wchar_t
) sera convertie en chaîne ANSI (contenant des caractères char
) avant d'être écrite dans la mémoire tampon interne. Pour stocker des chaînes Unicode dans la mémoire tampon, créez une mémoire tampon de type wchar_t
et définissez-la à l’aide de la basic_streambuf::pubsetbuf
()
méthode. Pour obtenir un exemple qui illustre ce comportement, voir ci-dessous.
Un objet de classe basic_filebuf<Char_T, Tr>
stocke un pointeur de fichier, qui désigne l’objet FILE
qui contrôle le flux associé à un fichier ouvert. Il stocke également des pointeurs vers deux facettes de conversion de fichier utilisables par les fonctions membres protégées overflow et underflow. Pour plus d’informations, consultez basic_filebuf::open
.
Exemple
L'exemple suivant montre comment forcer un objet de type basic_filebuf<wchar_t>
à stocker des caractères Unicode dans sa mémoire tampon interne en appelant la méthode 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...........
Constructeurs
Constructeur | Description |
---|---|
basic_filebuf | Construit un objet de type basic_filebuf . |
Typedefs
Nom de type | Description |
---|---|
char_type | Associe un nom de type au paramètre de modèle Char_T . |
int_type | Rend ce type dans la portée de basic_filebuf équivalent au type du même nom dans la portée de Tr . |
off_type | Rend ce type dans la portée de basic_filebuf équivalent au type du même nom dans la portée de Tr . |
pos_type | Rend ce type dans la portée de basic_filebuf équivalent au type du même nom dans la portée de Tr . |
traits_type | Associe un nom de type au paramètre de modèle Tr . |
Fonctions Membre
Fonction membre | Description |
---|---|
close | Ferme un fichier. |
is_open | Indique si un fichier est ouvert. |
open | Ouvre un fichier. |
overflow | Fonction virtuelle protégée qui peut être appelée quand un nouveau caractère est inséré dans une mémoire tampon saturée. |
pbackfail | La fonction membre virtuelle protégée tente de remettre un élément dans le flux d'entrée, puis d'en faire l'élément actif (vers lequel pointe le pointeur suivant). |
seekoff | La fonction membre virtuelle protégée tente de modifier les positions actuelles des flux contrôlés. |
seekpos | La fonction membre virtuelle protégée tente de modifier les positions actuelles des flux contrôlés. |
setbuf | La fonction membre virtuelle protégée effectue une opération spécifique à chaque mémoire tampon de flux dérivée. |
Swap | Échange le contenu de ce basic_filebuf avec le contenu du paramètre basic_filebuf fourni. |
sync | La fonction virtuelle protégée tente de synchroniser les flux contrôlés avec n’importe quel flux externe associé. |
uflow | Fonction virtuelle protégée pour extraire l'élément actif du flux d'entrée. |
underflow | Fonction virtuelle protégée pour extraire l'élément actif du flux d'entrée. |
Spécifications
Header :<fstream>
Espace de noms : std
basic_filebuf ::basic_filebuf
Construit un objet de type basic_filebuf
.
basic_filebuf();
basic_filebuf(basic_filebuf&& right);
Notes
Le premier constructeur stocke un pointeur null dans tous les pointeurs contrôlant la mémoire tampon d’entrée et la mémoire tampon de sortie. Il stocke également un pointeur null dans le pointeur de fichier.
Le deuxième constructeur initialise l’objet avec le contenu de right
, traité comme une référence rvalue.
basic_filebuf ::char_type
Associe un nom de type au paramètre de modèle Char_T
.
typedef Char_T char_type;
basic_filebuf ::close
Ferme un fichier.
basic_filebuf<Char_T, Tr> *close();
Valeur de retour
La fonction membre retourne un pointeur null si le pointeur de fichier est un pointeur null.
Notes
close
appelle fclose(fp)
. Si cette fonction retourne une valeur différente de zéro, la fonction retourne un pointeur null. Sinon, elle retourne this
pour indiquer que le fichier a été correctement fermé.
Pour un flux large, si des insertions se sont produites depuis l’ouverture du flux, ou depuis le dernier appel à streampos
, la fonction appelle overflow
. Il insère également toute séquence nécessaire pour restaurer l’état de conversion initial, à l’aide de la facette fac
de conversion de fichier pour appeler fac.unshift
si nécessaire. Chaque élément byte
de type char
produit est écrit dans le flux associé désigné par le pointeur fp
de fichier comme s’il s’agit d’appels successifs du formulaire fputc(byte, fp)
. Si l’appel à fac.unshift
ou l’écriture échoue, la fonction ne réussit pas.
Exemple
L’exemple suivant suppose deux fichiers dans le répertoire actif : basic_filebuf_close.txt (le contenu est « test ») et iotest.txt (le contenu est « 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
Rend ce type dans l’étendue basic_filebuf
équivalente au type du même nom dans l’étendue Tr
.
typedef typename traits_type::int_type int_type;
basic_filebuf ::is_open
Indique si un fichier est ouvert.
bool is_open() const;
Valeur de retour
true
si le pointeur de fichier n’est pas null.
Exemple
// 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
Rend ce type dans l’étendue basic_filebuf
équivalente au type du même nom dans l’étendue Tr
.
typedef typename traits_type::off_type off_type;
basic_filebuf ::open
Ouvre un fichier.
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);
Paramètres
nom_fichier
Nom du fichier à ouvrir.
mode
L’une des énumérations dans ios_base::openmode
.
protection
Protection d’ouverture de fichier par défaut, équivalente au paramètre shflag dans _fsopen, _wfsopen.
Valeur de retour
Si la mémoire tampon est déjà ouverte ou si le pointeur de fichier est un pointeur Null, la fonction retourne un pointeur Null. Sinon, this
est retourné.
Notes
Cette fonction utilise une FILE *
fonction pour revenir en arrière comme basic_filebuf
si vous aviez appelé fopen/wfopen
(filename, strmode)
. strmode
est déterminé à partir de mode & ~(
)
ate
|
binary
:
ios_base::in
devient"r"
(ouvrir un fichier existant pour la lecture).- ios_base ::out ou
ios_base::out | ios_base::trunc
devient"w"
(tronquer le fichier existant ou créer pour l’écriture). ios_base::out | app
devient"a"
(ouvrez le fichier existant pour ajouter toutes les écritures).ios_base::in | ios_base::out
devient"r+"
(ouvrir un fichier existant pour la lecture et l’écriture).ios_base::in | ios_base::out | ios_base::trunc
devient"w+"
(tronquer le fichier existant ou créer pour la lecture et l’écriture).ios_base::in | ios_base::out | ios_base::app
devient"a+"
(ouvrez le fichier existant pour lire et ajouter toutes les écritures).
Si mode & ios_base::binary
elle n’est pas différente de zéro, la fonction ajoute b
pour strmode
ouvrir un flux binaire au lieu d’un flux de texte.
S’il mode & ios_base::ate
n’est pas différent de zéro et que le fichier a été correctement ouvert, l’emplacement actuel du flux est positionné à la fin du fichier. En cas d’échec, le fichier est fermé.
Si les opérations ci-dessus se sont terminées avec succès, la facette de conversion de fichier est déterminée : use_facet<codecvt<Char_T, char, traits_type::
state_type
> >(
getloc
)
pour une utilisation par sous-flux et dépassement de capacité.
Si le fichier n’a pas pu être correctement ouvert, nullptr
est retourné.
Exemple
Consultez basic_filebuf::close
un exemple qui utilise open
.
basic_filebuf ::operator=
Affecter le contenu de cet objet de mémoire tampon de flux. Il s’agit d’une affectation de déplacement impliquant une rvalue qui ne laisse pas de copie derrière elle.
basic_filebuf& operator=(basic_filebuf&& right);
Paramètres
right
Référence rvalue à un objet basic_filebuf.
Valeur de retour
Retourne *this
.
Notes
L'opérateur membre remplace le contenu de l'objet à l'aide du contenu de right
, traité comme une référence rvalue. Pour plus d'informations, consultez Déclarateur de référence rvalue : &&.
basic_filebuf ::overflow
Appelé quand un nouveau caractère est inséré dans une mémoire tampon saturée.
virtual int_type overflow(int_type _Meta = traits_type::eof);
Paramètres
_Méta
Caractère à insérer dans la mémoire tampon ou traits_type::eof
.
Valeur de retour
Si la fonction ne peut pas réussir, elle retourne traits_type::eof
. Sinon, traits_type::
not_eof
(_Meta)
est retourné.
Notes
Si _Meta != traits_type::
eof
, la fonction membre virtuelle protégée tente d’insérer l’élément(_Meta)
ch = traits_type::
to_char_type
dans la mémoire tampon de sortie. Elle peut le faire de différentes manières :
Si une position d’écriture est disponible, elle peut stocker l’élément dans la position d’écriture et incrémenter le pointeur suivant pour la mémoire tampon de sortie.
Elle peut rendre disponible une position d’écriture en allouant du stockage nouveau ou supplémentaire à la mémoire tampon de sortie.
Il peut convertir n’importe quelle sortie en attente dans la mémoire tampon de sortie, suivie par
ch
, à l’aide de la facettefac
de conversion de fichier pour appelerfac.out
si nécessaire. Chaque élémentch
produit de type char est écrit dans le flux associé désigné par le pointeurfp
de fichier comme s’il s’agit d’appels successifs du formulairefputc(ch, fp)
. Si une conversion ou écriture échoue, la fonction ne réussit pas.
basic_filebuf ::p backfail
Tente de remettre un élément dans le flux d’entrée, puis d’en faire l’élément actuel (désigné par le pointeur suivant).
virtual int_type pbackfail(int_type _Meta = traits_type::eof);
Paramètres
_Méta
Caractère à insérer dans la mémoire tampon, ou traits_type::eof
.
Valeur de retour
Si la fonction ne peut pas réussir, elle retourne traits_type::eof
. Sinon, traits_type::
not_eof
(_Meta)
est retourné.
Notes
La fonction membre virtuelle protégée remet un élément dans la mémoire tampon d’entrée, puis en fait l’élément actuel (désigné par le pointeur suivant). Si _Meta == traits_type::
eof
, l’élément à renvoyer est effectivement celui déjà dans le flux avant l’élément actuel. Sinon, cet élément est remplacé par ch = traits_type::
to_char_type
(_Meta)
. La fonction peut remettre un élément de différentes manières :
Si une
putback
position est disponible et que l’élément stocké y est égalch
, il peut décrémenter le pointeur suivant pour la mémoire tampon d’entrée.Si la fonction peut rendre une
putback
position disponible, elle peut le faire, définir le pointeur suivant sur ce pointeur et le stockerch
dans cette position.Si la fonction peut renvoyer un élément sur le flux d’entrée, elle peut le faire, par exemple en appelant
ungetc
un élément de typechar
.
basic_filebuf ::p os_type
Rend ce type dans l’étendue basic_filebuf
équivalente au type du même nom dans l’étendue Tr
.
typedef typename traits_type::pos_type pos_type;
basic_filebuf ::seekoff
Tente de modifier les positions actuelles des flux contrôlés.
virtual pos_type seekoff(
off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Paramètres
_De
Position à rechercher par rapport à _Way.
_Manière
Point de départ des opérations de décalage. Consultez seekdir pour connaître les valeurs possibles.
_Quel
Spécifie le mode pour la position du pointeur. Par défaut, vous êtes autorisé à modifier les positions de lecture et d’écriture.
Valeur de retour
Retourne la nouvelle position ou une position de flux non valide.
Notes
La fonction membre virtuelle protégée tente de modifier les positions actuelles des flux contrôlés. Pour un objet de classe basic_filebuf
<Char_T, Tr>
, une position de flux peut être représentée par un objet de type fpos_t
, qui stocke un décalage et toutes les informations d’état nécessaires pour analyser un flux large. Offset zéro fait référence au premier élément du flux. (Un objet de type pos_type
stocke au moins un objet fpos_t
.)
Dans le cas d’un fichier ouvert pour lecture et écriture, les flux d’entrée et de sortie sont positionnés en tandem. Pour basculer entre l’insertion et l’extraction, vous devez appeler l’une ou l’autre pubseekoff
.pubseekpos
Les appels à pubseekoff
(et donc à seekoff
) ont plusieurs limites pour les flux de texte, les flux binaires et les flux larges.
Si le pointeur de fichier est un pointeur fp
Null, la fonction échoue. Sinon, il tente de modifier la position du flux en appelant fseek(fp, _Off, _Way)
. Si cette fonction réussit et que la position fposn
résultante peut être déterminée en appelant fgetpos(fp, &fposn)
, la fonction réussit. Si la fonction réussit, elle retourne une valeur de type pos_type
contenant fposn
. Sinon, elle retourne une position de flux non valide.
basic_filebuf ::seekpos
Tente de modifier les positions actuelles des flux contrôlés.
virtual pos_type seekpos(
pos_type _Sp,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Paramètres
_Sp
Position à rechercher.
_Quel
Spécifie le mode pour la position du pointeur. Par défaut, vous êtes autorisé à modifier les positions de lecture et d’écriture.
Valeur de retour
Si le pointeur de fichier est un pointeur fp
Null, la fonction échoue. Sinon, il tente de modifier la position du flux en appelant fsetpos(fp, &fposn)
, où fposn
est l’objet fpos_t
stocké dans pos
. Si la fonction réussit, elle retourne pos
. Sinon, elle retourne une position de flux non valide. Pour déterminer si la position du flux est non valide, comparez la valeur de retour à pos_type(off_type(-1))
.
Notes
La fonction membre virtuelle protégée tente de modifier les positions actuelles des flux contrôlés. Pour un objet de classe basic_filebuf
<Char_T, Tr>
, une position de flux peut être représentée par un objet de type fpos_t
, qui stocke un décalage et toutes les informations d’état nécessaires pour analyser un flux large. Offset zéro fait référence au premier élément du flux. (Un objet de type pos_type
stocke au moins un objet fpos_t
.)
Dans le cas d’un fichier ouvert pour lecture et écriture, les flux d’entrée et de sortie sont positionnés en tandem. Pour basculer entre l’insertion et l’extraction, vous devez appeler l’une ou l’autre pubseekoff
.pubseekpos
Les appels à (et à pubseekoff
seekoff
) ont diverses limitations pour les flux de texte, les flux binaires et les flux larges.
Pour un flux large, si des insertions se sont produites depuis l’ouverture du flux, ou depuis le dernier appel à streampos
, la fonction appelle overflow
. Il insère également toute séquence nécessaire pour restaurer l’état de conversion initial, à l’aide de la facette fac
de conversion de fichier pour appeler fac.unshift
si nécessaire. Chaque élément byte
de type char
produit est écrit dans le flux associé désigné par le pointeur fp
de fichier comme s’il s’agit d’appels successifs du formulaire fputc(byte, fp)
. Si l’appel à fac.unshift
ou l’écriture échoue, la fonction ne réussit pas.
basic_filebuf ::setbuf
Effectue une opération spécifique pour chaque mémoire tampon de flux dérivée.
virtual basic_streambuf<Char_T, Tr> *setbuf(
char_type* _Buffer,
streamsize count);
Paramètres
_Tampon
Pointeur vers une mémoire tampon.
count
Taille de la mémoire tampon.
Valeur de retour
La fonction membre protégée retourne un zéro si le pointeur de fichier fp
est un pointeur null.
Notes
setbuf
appels setvbuf( fp, (char*) _Buffer, _IOFBF, count * sizeof( Char_T))
pour offrir le tableau d’éléments count
commençant à _Buffer en tant que mémoire tampon pour le flux. Si cette fonction retourne une valeur différente de zéro, la fonction retourne un pointeur null. Sinon, elle revient this
à signaler la réussite.
basic_filebuf ::swap
Échange le contenu de ce basic_filebuf
avec le contenu du basic_filebuf
fourni.
void swap(basic_filebuf& right);
Paramètres
right
Référence lvalue à un autre basic_filebuf
.
basic_filebuf ::sync
Tente de synchroniser les flux contrôlés avec n’importe quel flux externe associé.
virtual int sync();
Valeur de retour
Retourne zéro si le pointeur fp
de fichier est un pointeur Null. Sinon, elle retourne zéro uniquement si les appels au dépassement de capacité et fflush(fp)
réussissent à vider une sortie en attente dans le flux.
basic_filebuf ::traits_type
Associe un nom de type au paramètre de modèle Tr
.
typedef Tr traits_type;
basic_filebuf ::underflow
Extrait l’élément actuel du flux d’entrée.
virtual int_type underflow();
Valeur de retour
Si la fonction ne peut pas réussir, elle retourne traits_type::
eof
. Sinon, elle retourne ch
, convertie comme décrit dans la section Notes.
Notes
La fonction membre virtuelle protégée tente d’extraire l’élément ch
actuel du flux d’entrée et de renvoyer l’élément en tant queto_int_type
traits_type::
(ch)
. Elle peut le faire de différentes manières :
Si une position de lecture est disponible, elle prend
ch
comme élément stocké dans la position de lecture et avance le pointeur suivant pour la mémoire tampon d’entrée.Il peut lire un ou plusieurs éléments de type
char
, comme s’il s’agit d’appels successifs du formulairefgetc(fp)
, et les convertir en élémentch
de typeChar_T
à l’aide de la facettefac
de conversion de fichier pour appelerfac.in
si nécessaire. Si une lecture ou une conversion échoue, la fonction ne réussit pas.
Voir aussi
<fstream>
Sécurité des threads dans la bibliothèque C++ Standard
iostream, programmation
iostreams, conventions