basic_filebuf – třída
Popisuje vyrovnávací paměť datového proudu, která řídí přenos prvků typu Char_T, jejichž znakové vlastnosti jsou určeny třídou Tr, do a ze sekvence prvků uložených v externím souboru.
Syntaxe
template <class Char_T, class Tr = char_traits<Char_T>>
class basic_filebuf : public basic_streambuf<Char_T, Tr>
Parametry
Char_T
Základní prvek vyrovnávací paměti souboru.
Tr
Vlastnosti základního prvku vyrovnávací paměti souboru (obvykle char_traits<Char_T>
).
Poznámky
Šablona třídy popisuje vyrovnávací paměť datového proudu, která řídí přenos prvků typu Char_T, jejichž znakové vlastnosti jsou určeny třídou Tr, do a z posloupnosti prvků uložených v externím souboru.
Poznámka:
Objekty typu basic_filebuf
jsou vytvořeny s interní vyrovnávací pamětí typu char* bez char_type
ohledu na zadaný parametr typu Char_T. To znamená, že řetězec Unicode (obsahující wchar_t
znaky) se před zápisem do interní vyrovnávací paměti převede na řetězec ANSI (obsahující char
znaky). Pokud chcete do vyrovnávací paměti uložit řetězce Unicode, vytvořte novou vyrovnávací paměť typu wchar_t
a nastavte ji pomocí basic_streambuf::pubsetbuf
()
metody. Pokud chcete vidět příklad, který toto chování ukazuje, podívejte se níže.
Objekt třídy basic_filebuf<Char_T, Tr>
ukládá ukazatel souboru, který určuje FILE
objekt, který řídí datový proud přidružený k otevřenému souboru. Ukládá také ukazatele na dvě omezující vlastnosti převodu souborů pro použití chráněnými členskými funkcemi přetečením a podtečením. Další informace najdete na webu basic_filebuf::open
.
Příklad
Následující příklad ukazuje, jak vynutit objekt typu basic_filebuf<wchar_t>
uložit znaky Unicode do jeho vnitřní vyrovnávací paměti voláním pubsetbuf()
metody.
// 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...........
Konstruktory
Konstruktor | Popis |
---|---|
basic_filebuf | Vytvoří objekt typu basic_filebuf . |
Typedefs
Název typu | Popis |
---|---|
char_type | Přidruží název typu k parametru Char_T šablony. |
int_type | Tento typ v basic_filebuf oboru odpovídá typu stejného názvu v Tr oboru. |
off_type | Tento typ v basic_filebuf oboru odpovídá typu stejného názvu v Tr oboru. |
pos_type | Tento typ v basic_filebuf oboru odpovídá typu stejného názvu v Tr oboru. |
traits_type | Přidruží název typu k parametru Tr šablony. |
Členské funkce
Členová funkce | Popis |
---|---|
close | Zavře soubor. |
is_open | Určuje, zda je soubor otevřen. |
open | Otevře soubor. |
přetečení | Chráněná virtuální funkce, kterou lze volat při vložení nového znaku do plné vyrovnávací paměti. |
pbackfail | Chráněná virtuální členová funkce se pokusí vrátit prvek do vstupního datového proudu a pak ho nastavit jako aktuální prvek (na který odkazuje další ukazatel). |
hledání | Chráněná virtuální členová funkce se pokusí změnit aktuální pozice pro řízené datové proudy. |
hledání | Chráněná virtuální členová funkce se pokusí změnit aktuální pozice pro řízené datové proudy. |
setbuf | Chráněná virtuální členová funkce provádí operaci určitou pro každou odvozenou vyrovnávací paměť datového proudu. |
Vyměnit | Vymění obsah tohoto basic_filebuf parametru pro obsah poskytnutého basic_filebuf parametru. |
synchronizovat | Chráněná virtuální funkce se pokusí synchronizovat řízené streamy s libovolnými přidruženými externími streamy. |
uflow | Chráněná virtuální funkce pro extrahování aktuálního prvku ze vstupního datového proudu |
podtečení | Chráněná virtuální funkce pro extrahování aktuálního prvku ze vstupního datového proudu |
Požadavky
Header:<fstream>
Obor názvů: std
basic_filebuf::basic_filebuf
Vytvoří objekt typu basic_filebuf
.
basic_filebuf();
basic_filebuf(basic_filebuf&& right);
Poznámky
První konstruktor ukládá ukazatel null ve všech ukazatelích, které řídí vstupní vyrovnávací paměť a výstupní vyrovnávací paměť. Uloží také ukazatel null v ukazateli souboru.
Druhý konstruktor inicializuje objekt s obsahem right
, považován za rvalue odkaz.
basic_filebuf::char_type
Přidruží název typu k parametru Char_T
šablony.
typedef Char_T char_type;
basic_filebuf::close
Zavře soubor.
basic_filebuf<Char_T, Tr> *close();
Návratová hodnota
Členová funkce vrátí ukazatel null, pokud je ukazatel souboru nulový.
Poznámky
close
volání fclose(fp)
. Pokud tato funkce vrátí nenulovou hodnotu, vrátí funkce ukazatel null. V opačném případě se vrátí this
k označení, že soubor byl úspěšně zavřený.
U širokého datového proudu, pokud došlo k vložení od doby, kdy byl datový proud otevřen, nebo od posledního volání streampos
, volání overflow
funkce . Vloží také libovolnou sekvenci potřebnou k obnovení počátečního stavu převodu pomocí omezující vlastnosti fac
převodu souboru k volání fac.unshift
podle potřeby. Každý vytvořený prvek byte
typu char
je zapsán do přidruženého streamu určeného ukazatelem fp
souboru, jako by následné volání formuláře fputc(byte, fp)
. Pokud volání fac.unshift
nebo jakýkoli zápis selže, funkce nebude úspěšná.
Příklad
Následující ukázka předpokládá dva soubory v aktuálním adresáři: basic_filebuf_close.txt (obsah je "testování") a iotest.txt (obsah je "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
Tento typ v basic_filebuf
oboru odpovídá typu stejného názvu v Tr
oboru.
typedef typename traits_type::int_type int_type;
basic_filebuf::is_open
Určuje, zda je soubor otevřen.
bool is_open() const;
Návratová hodnota
true
pokud ukazatel souboru nemá hodnotu null.
Příklad
// 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
Tento typ v basic_filebuf
oboru odpovídá typu stejného názvu v Tr
oboru.
typedef typename traits_type::off_type off_type;
basic_filebuf::open
Otevře soubor.
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);
Parametry
filename
Název souboru, který se má otevřít.
režim
Jeden z výčtů v ios_base::openmode
.
ochrana
Výchozí ochrana pro otevření souboru, která odpovídá parametru shflag v _fsopen, _wfsopen.
Návratová hodnota
Pokud je vyrovnávací paměť již otevřená nebo pokud je ukazatel souboru nulový, vrátí funkce nulový ukazatel. V opačném případě se vrátí this
.
Poznámky
Tato funkce používá FILE *
k vrácení zpět, basic_filebuf
jako kdybyste volali fopen/wfopen
(filename, strmode)
. strmode
je určen z mode & ~(
ate
binary
|
)
:
ios_base::in
se změní na (otevřete existující soubor pro čtení).</a0> - ios_base::out nebo
ios_base::out | ios_base::trunc
se stane"w"
(zkrátit existující soubor nebo vytvořit pro zápis). ios_base::out | app
se stane"a"
(otevřete existující soubor pro připojení všech zápisů).ios_base::in | ios_base::out
se stane"r+"
(otevřete existující soubor pro čtení a zápis).ios_base::in | ios_base::out | ios_base::trunc
se zkrátí"w+"
(zkrátí existující soubor nebo vytvoří pro čtení a zápis).ios_base::in | ios_base::out | ios_base::app
se stane"a+"
(otevřete existující soubor pro čtení a pro připojení všech zápisů).
Pokud mode & ios_base::binary
je nenulový, funkce připojí b
k strmode
otevření binárního datového proudu místo textového streamu.
Pokud mode & ios_base::ate
je nenulový a soubor byl úspěšně otevřen, aktuální umístění v datovém proudu se umístí na konec souboru. Pokud se to nezdaří, soubor se zavře.
Pokud se výše uvedené operace úspěšně dokončily, určí se omezující vlastnost převodu souboru: use_facet<codecvt<Char_T, char, traits_type::
getloc
)
> >(
state_type
, pro použití podtečením a přetečením.
Pokud se soubor nepodařilo úspěšně otevřít, nullptr
vrátí se.
Příklad
Podívejte basic_filebuf::close
se na příklad, který používá open
.
basic_filebuf::operator=
Přiřaďte obsah tohoto objektu vyrovnávací paměti datového proudu. Jedná se o přiřazení přesunutí zahrnující rvalue, které neopouští kopii.
basic_filebuf& operator=(basic_filebuf&& right);
Parametry
Vpravo
Odkaz rvalue na objekt basic_filebuf .
Návratová hodnota
Vrací objekt *this
.
Poznámky
Operátor člena nahrazuje obsah objektu pomocí obsahu right
, považován za rvalue odkaz. Další informace naleznete v tématu Deklarátor odkazu Rvalue: &>.
basic_filebuf::overflow
Volá se při vložení nového znaku do plné vyrovnávací paměti.
virtual int_type overflow(int_type _Meta = traits_type::eof);
Parametry
_Meta
Znak, který se má vložit do vyrovnávací paměti nebo traits_type::eof
.
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí hodnotu traits_type::eof
. V opačném případě se vrátí traits_type::
not_eof
(_Meta)
.
Poznámky
Pokud _Meta != traits_type::
eof
se chráněná virtuální členová funkce pokusí vložit prvek ch = traits_type::
to_char_type
(_Meta)
do výstupní vyrovnávací paměti. Může to udělat různými způsoby:
Pokud je k dispozici pozice zápisu, může prvek uložit do pozice zápisu a zvýšit další ukazatel pro výstupní vyrovnávací paměť.
Může zpřístupnit pozici zápisu přidělením nového nebo dalšího úložiště pro výstupní vyrovnávací paměť.
Může převést jakýkoli čekající výstup ve výstupní vyrovnávací paměti následovaný
ch
pomocí omezující vlastnostifac
převodu souboru podlefac.out
potřeby. Každý vytvořený prvekch
typu char je zapsán do přidruženého streamu určeného ukazatelemfp
souboru, jako by následné volání formulářefputc(ch, fp)
. Pokud jakýkoli převod nebo zápis selže, funkce nebude úspěšná.
basic_filebuf::p backfail
Pokusí se vrátit prvek do vstupního datového proudu a pak ho nastavit jako aktuální prvek (na který odkazuje další ukazatel).
virtual int_type pbackfail(int_type _Meta = traits_type::eof);
Parametry
_Meta
Znak, který se má vložit do vyrovnávací paměti, nebo traits_type::eof
.
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí hodnotu traits_type::eof
. V opačném případě se vrátí traits_type::
not_eof
(_Meta)
.
Poznámky
Chráněná virtuální členová funkce vloží zpět prvek do vstupní vyrovnávací paměti a pak z něj vytvoří aktuální prvek (odkazuje na další ukazatel). Pokud _Meta == traits_type::
eof
, prvek pro nasdílení zpět je účinně ten, který již v datovém proudu před aktuálním prvkem. V opačném případě se tento prvek nahradí znakem ch = traits_type::
to_char_type
(_Meta)
. Funkce může vrátit prvek různými způsoby:
putback
Pokud je k dispozici pozice a prvek, který je tam uložen, porovnává stejnéch
, může dekrementovat další ukazatel vstupní vyrovnávací paměti.Pokud může funkce zpřístupnit
putback
pozici, může to udělat, nastavit další ukazatel na tuto pozici a uložitch
ji do této pozice.Pokud funkce může nasdílit zpět prvek do vstupního datového proudu, může to udělat, například voláním
ungetc
prvku typuchar
.
basic_filebuf::p os_type
Tento typ v basic_filebuf
oboru odpovídá typu stejného názvu v Tr
oboru.
typedef typename traits_type::pos_type pos_type;
basic_filebuf::seekoff
Pokusí se změnit aktuální pozice pro řízené proudy.
virtual pos_type seekoff(
off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Pryč
Pozice, která se má hledat vzhledem k _Way.
_Cesta
Výchozí bod pro operace posunu. Informace o možných hodnotách najdete v nástroji seekdir .
_Který
Určuje režim pozice ukazatele. Výchozí nastavení je umožnit úpravu pozic čtení a zápisu.
Návratová hodnota
Vrátí novou pozici nebo neplatnou pozici datového proudu.
Poznámky
Chráněná virtuální členová funkce se pokusí změnit aktuální pozice pro řízené datové proudy. U objektu třídy basic_filebuf
<Char_T, Tr>
může být pozice datového proudu reprezentována objektem typu fpos_t
, který ukládá posun a všechny informace o stavu potřebné k analýze širokého datového proudu. Odsazení nuly odkazuje na první prvek datového proudu. (Objekt typu pos_type
ukládá alespoň fpos_t
objekt.)
U souboru otevřeného pro čtení i zápis jsou vstupní i výstupní proudy umístěny společně. Pokud chcete přepínat mezi vkládáním a extrahováním, musíte zavolat nebo pubseekoff
pubseekpos
. Volání ( pubseekoff
a proto) seekoff
mají různá omezení pro textové streamy, binární streamy a široké datové proudy.
Pokud je ukazatel souboru nulovým fp
ukazatelem, funkce selže. Jinak se pokusí změnit pozici datového proudu voláním fseek(fp, _Off, _Way)
. Pokud je tato funkce úspěšná a výsledná pozice fposn
může být určena voláním fgetpos(fp, &fposn)
, funkce bude úspěšná. Pokud je funkce úspěšná, vrátí hodnotu typu pos_type
obsahujícího fposn
. V opačném případě vrátí neplatnou pozici datového proudu.
basic_filebuf::seekpos
Pokusí se změnit aktuální pozice pro řízené proudy.
virtual pos_type seekpos(
pos_type _Sp,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Sp
Pozice, na které se má hledat.
_Který
Určuje režim pozice ukazatele. Výchozí nastavení je umožnit úpravu pozic čtení a zápisu.
Návratová hodnota
Pokud je ukazatel souboru nulovým fp
ukazatelem, funkce selže. Jinak se pokusí změnit pozici datového proudu voláním fsetpos(fp, &fposn)
, kde fposn
je fpos_t
objekt uložený v pos
. Pokud je tato funkce úspěšná, vrátí pos
funkce . V opačném případě vrátí neplatnou pozici datového proudu. Chcete-li zjistit, zda je pozice datového proudu neplatná, porovnejte návratovou hodnotu s pos_type(off_type(-1))
.
Poznámky
Chráněná virtuální členová funkce se pokusí změnit aktuální pozice pro řízené datové proudy. U objektu třídy basic_filebuf
<Char_T, Tr>
může být pozice datového proudu reprezentována objektem typu fpos_t
, který ukládá posun a všechny informace o stavu potřebné k analýze širokého datového proudu. Odsazení nuly odkazuje na první prvek datového proudu. (Objekt typu pos_type
ukládá alespoň fpos_t
objekt.)
U souboru otevřeného pro čtení i zápis jsou vstupní i výstupní proudy umístěny společně. Pokud chcete přepínat mezi vkládáním a extrahováním, musíte zavolat nebo pubseekoff
pubseekpos
. pubseekoff
Volání (a) seekoff
mají různá omezení pro textové streamy, binární streamy a široké datové proudy.
U širokého datového proudu, pokud došlo k vložení od doby, kdy byl datový proud otevřen, nebo od posledního volání streampos
, volání overflow
funkce . Vloží také libovolnou sekvenci potřebnou k obnovení počátečního stavu převodu pomocí omezující vlastnosti fac
převodu souboru k volání fac.unshift
podle potřeby. Každý vytvořený prvek byte
typu char
je zapsán do přidruženého streamu určeného ukazatelem fp
souboru, jako by následné volání formuláře fputc(byte, fp)
. Pokud volání fac.unshift
nebo jakýkoli zápis selže, funkce nebude úspěšná.
basic_filebuf::setbuf
Provede určitou operaci pro každou odvozenou vyrovnávací paměť datového proudu.
virtual basic_streambuf<Char_T, Tr> *setbuf(
char_type* _Buffer,
streamsize count);
Parametry
_Vyrovnávací paměť
Ukazatel na vyrovnávací paměť.
count
Velikost vyrovnávací paměti.
Návratová hodnota
Chráněná členová funkce vrátí nulu, pokud je ukazatel souboru fp
nulový.
Poznámky
setbuf
volání setvbuf( fp, (char*) _Buffer, _IOFBF, count * sizeof( Char_T))
, která nabízejí pole count
prvků začínajících na _Buffer jako vyrovnávací paměť pro datový proud. Pokud tato funkce vrátí nenulovou hodnotu, vrátí funkce ukazatel null. V opačném případě se vrátí this
k úspěšnému signálu.
basic_filebuf::swap
Vymění obsah tohoto basic_filebuf
obsahu pro poskytnutý basic_filebuf
obsah .
void swap(basic_filebuf& right);
Parametry
Vpravo
Lvalue odkaz na jiný basic_filebuf
.
basic_filebuf::sync
Pokusí se synchronizovat řízené streamy s libovolnými přidruženými externími streamy.
virtual int sync();
Návratová hodnota
Vrátí nulu, pokud je ukazatel fp
souboru nulový. V opačném případě vrátí nulu pouze v případě, že volání přetečení a fflush(fp)
úspěšné vyprázdnění jakéhokoli čekajícího výstupu do datového proudu.
basic_filebuf::traits_type
Přidruží název typu k parametru Tr
šablony.
typedef Tr traits_type;
basic_filebuf::underflow
Extrahuje aktuální prvek ze vstupního datového proudu.
virtual int_type underflow();
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí hodnotu traits_type::
eof
. V opačném případě se vrátí ch
, převedeno, jak je popsáno v oddílu Poznámky.
Poznámky
Chráněná virtuální členová funkce se pokusí extrahovat aktuální prvek ch
ze vstupního datového proudu a vrátit prvek jakoto_int_type
traits_type::
(ch)
. Může to udělat různými způsoby:
Pokud je pozice čtení k dispozici, přebírá
ch
jako prvek uložený v pozici čtení a přejde dalším ukazatelem vstupní vyrovnávací paměti.Může číst jeden nebo více prvků typu
char
, jako by po sobě volání formulářefgetc(fp)
, a převést je na prvekch
typuChar_T
pomocí omezující vlastnostifac
souboru pro volánífac.in
podle potřeby. Pokud jakékoli čtení nebo převod selže, funkce nebude úspěšná.
Viz také
<fstream>
Bezpečný přístup z více vláken ve standardní knihovně C++
iostream – programování
iostreams – konvence