Bagikan melalui


Kelas basic_filebuf

Menjelaskan buffer aliran yang mengontrol transmisi elemen jenis Char_T, yang sifat karakternya ditentukan oleh kelas Tr, ke dan dari urutan elemen yang disimpan dalam file eksternal.

Sintaks

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

Parameter

Char_T
Elemen dasar buffer file.

Tr
Ciri-ciri elemen dasar buffer file (biasanya char_traits<Char_T>).

Keterangan

Templat kelas menjelaskan buffer aliran yang mengontrol transmisi elemen jenis Char_T, yang sifat karakternya ditentukan oleh kelas Tr, ke dan dari urutan elemen yang disimpan dalam file eksternal.

Catatan

Objek jenis basic_filebuf dibuat dengan buffer internal jenis karakter* terlepas dari char_type yang ditentukan oleh parameter jenis Char_T. Ini berarti bahwa string Unicode (berisi wchar_t karakter) akan dikonversi ke string ANSI (berisi char karakter) sebelum ditulis ke buffer internal. Untuk menyimpan string Unicode di buffer, buat buffer wchar_t jenis baru dan atur menggunakan basic_streambuf::pubsetbuf() metode . Untuk melihat contoh yang menunjukkan perilaku ini, lihat di bawah ini.

Objek kelas basic_filebuf<Char_T, Tr> menyimpan penunjuk file, yang menunjuk FILE objek yang mengontrol aliran yang terkait dengan file terbuka. Ini juga menyimpan pointer ke dua faset konversi file untuk digunakan oleh fungsi anggota yang dilindungi meluap dan underflow. Untuk informasi selengkapnya, lihat basic_filebuf::open .

Contoh

Contoh berikut menunjukkan cara memaksa objek jenis basic_filebuf<wchar_t> untuk menyimpan karakter Unicode di buffer internalnya dengan memanggil pubsetbuf() metode .

// 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...........

Konstruktor

Konstruktor Deskripsi
basic_filebuf Membuat objek jenis basic_filebuf.

Typedefs

Nama jenis Deskripsi
char_type Mengaitkan nama jenis dengan Char_T parameter templat.
int_type Membuat jenis ini dalam basic_filebufcakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.
off_type Membuat jenis ini dalam basic_filebufcakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.
pos_type Membuat jenis ini dalam basic_filebufcakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.
traits_type Mengaitkan nama jenis dengan Tr parameter templat.

Fungsi anggota

Fungsi anggota Deskripsi
tutup Menutup berkas.
is_open Menunjukkan apakah file terbuka.
buka Membuka file.
tumpah Fungsi virtual terproteksi yang dapat dipanggil ketika karakter baru dimasukkan ke dalam buffer penuh.
pbackfail Fungsi anggota virtual yang dilindungi mencoba mengembalikan elemen ke dalam aliran input, lalu menjadikannya elemen saat ini (ditujukkan ke penunjuk berikutnya).
seekoff Fungsi anggota virtual yang dilindungi mencoba mengubah posisi saat ini untuk aliran yang dikontrol.
seekpos Fungsi anggota virtual yang dilindungi mencoba mengubah posisi saat ini untuk aliran yang dikontrol.
setbuf Fungsi anggota virtual yang dilindungi melakukan operasi khusus untuk setiap buffer aliran turunan.
Swap Menukar konten ini basic_filebuf dengan konten parameter yang disediakan basic_filebuf .
Sync Fungsi virtual yang dilindungi mencoba menyinkronkan aliran terkontrol dengan aliran eksternal terkait.
uflow Fungsi virtual yang dilindungi untuk mengekstrak elemen saat ini dari aliran input.
aliran bawah Fungsi virtual yang dilindungi untuk mengekstrak elemen saat ini dari aliran input.

Persyaratan

Header:<fstream>

Namespace: std

basic_filebuf::basic_filebuf

Membuat objek jenis basic_filebuf.

basic_filebuf();

basic_filebuf(basic_filebuf&& right);

Keterangan

Konstruktor pertama menyimpan pointer null di semua pointer yang mengontrol buffer input dan buffer output. Ini juga menyimpan pointer null di penunjuk file.

Konstruktor kedua menginisialisasi objek dengan konten right, diperlakukan sebagai referensi rvalue.

basic_filebuf::char_type

Mengaitkan nama jenis dengan Char_T parameter templat.

typedef Char_T char_type;

basic_filebuf::close

Menutup berkas.

basic_filebuf<Char_T, Tr> *close();

Tampilkan Nilai

Fungsi anggota mengembalikan penunjuk null jika penunjuk file adalah penunjuk null.

Keterangan

closefclose(fp)memanggil . Jika fungsi tersebut mengembalikan nilai bukan nol, fungsi mengembalikan penunjuk null. Jika tidak, ia kembali this untuk menunjukkan bahwa file berhasil ditutup.

Untuk aliran lebar, jika ada penyisipan yang terjadi sejak aliran dibuka, atau sejak panggilan terakhir ke streampos, fungsi memanggil overflow. Ini juga menyisipkan urutan apa pun yang diperlukan untuk memulihkan status konversi awal, dengan menggunakan faset fac konversi file untuk memanggil fac.unshift sesuai kebutuhan. Setiap elemen byte jenis char yang dihasilkan ditulis ke aliran terkait yang ditunjuk oleh penunjuk fp file seolah-olah oleh panggilan formulir fputc(byte, fp)berturut-turut . Jika panggilan ke fac.unshift atau penulisan apa pun gagal, fungsi tidak berhasil.

Contoh

Sampel berikut mengasumsikan dua file dalam direktori saat ini: basic_filebuf_close.txt (kontennya adalah "pengujian") dan iotest.txt (kontennya adalah "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

Membuat jenis ini dalam basic_filebuf cakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.

typedef typename traits_type::int_type int_type;

basic_filebuf::is_open

Menunjukkan apakah file terbuka.

bool is_open() const;

Tampilkan Nilai

true jika penunjuk file tidak null.

Contoh

// 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

Membuat jenis ini dalam basic_filebuf cakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.

typedef typename traits_type::off_type off_type;

basic_filebuf::open

Membuka file.

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);

Parameter

filename
Nama file yang akan dibuka.

mode
Salah satu enumerasi dalam ios_base::openmode.

perlindungan
Perlindungan pembukaan file default, setara dengan parameter shflag di _fsopen, _wfsopen.

Tampilkan Nilai

Jika buffer sudah terbuka, atau jika penunjuk file adalah penunjuk null, fungsi mengembalikan penunjuk null. Jika tidak, ia kembali this.

Keterangan

Fungsi ini menggunakan FILE * untuk mendukung basic_filebuf seolah-olah Anda telah memanggil fopen/wfopen(filename, strmode). strmodeditentukan dari mode & ~()ate | binary:

  • ios_base::in"r" menjadi (buka file yang ada untuk dibaca).
  • ios_base::out atau ios_base::out | ios_base::trunc menjadi "w" (potong file yang ada atau buat untuk menulis).
  • ios_base::out | app"a" menjadi (buka file yang ada untuk menambahkan semua tulisan).
  • ios_base::in | ios_base::out"r+" menjadi (buka file yang ada untuk membaca dan menulis).
  • ios_base::in | ios_base::out | ios_base::trunc"w+" menjadi (memotong file yang ada atau membuat untuk membaca dan menulis).
  • ios_base::in | ios_base::out | ios_base::app"a+" menjadi (buka file yang ada untuk membaca dan untuk menambahkan semua tulisan).

Jika mode & ios_base::binary bukan nol, fungsi ditambahkan b ke untuk strmode membuka aliran biner alih-alih aliran teks. Jika mode & ios_base::ate bukan nol dan file berhasil dibuka, lokasi saat ini di aliran diposisikan di akhir file. Jika gagal, file ditutup.

Jika operasi di atas berhasil diselesaikan, faset konversi file ditentukan: use_facet<codecvt<Char_T, char, traits_type::state_type)> >(getloc, untuk digunakan oleh aliran bawah dan luapan.

Jika file tidak berhasil dibuka, nullptr dikembalikan.

Contoh

Lihat basic_filebuf::close contoh yang menggunakan open.

basic_filebuf::operator=

Tetapkan isi objek buffer aliran ini. Ini adalah penetapan pemindahan yang melibatkan rvalue yang tidak meninggalkan salinan di belakang.

basic_filebuf& operator=(basic_filebuf&& right);

Parameter

right
Referensi rvalue ke objek basic_filebuf .

Tampilkan Nilai

Menampilkan *this.

Keterangan

Operator anggota menggantikan konten objek dengan menggunakan konten right, diperlakukan sebagai referensi rvalue. Untuk informasi selengkapnya, lihat Deklarator referensi Rvalue: &&&.

basic_filebuf::overflow

Dipanggil ketika karakter baru dimasukkan ke dalam buffer penuh.

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

Parameter

_Meta
Karakter yang akan dimasukkan ke dalam buffer atau traits_type::eof.

Tampilkan Nilai

Jika fungsi tidak berhasil, fungsi akan mengembalikan traits_type::eof. Jika tidak, ia kembali traits_type::not_eof(_Meta).

Keterangan

Jika _Meta != traits_type::eof, fungsi anggota virtual yang dilindungi mencoba memasukkan elemen(_Meta) ch = traits_type::to_char_typeke dalam buffer output. Ini dapat melakukannya dengan berbagai cara:

  • Jika posisi tulis tersedia, ia dapat menyimpan elemen ke dalam posisi tulis dan menaikkan pointer berikutnya untuk buffer output.

  • Ini dapat membuat posisi tulis tersedia dengan mengalokasikan penyimpanan baru atau tambahan untuk buffer output.

  • Ini dapat mengonversi output yang tertunda dalam buffer output, diikuti oleh ch, dengan menggunakan faset fac konversi file untuk memanggil fac.out sesuai kebutuhan. Setiap elemen ch karakter jenis yang diproduksi ditulis ke aliran terkait yang ditunjuk oleh penunjuk fp file seolah-olah dengan panggilan berturut-turut dari formulir fputc(ch, fp). Jika ada konversi atau penulisan yang gagal, fungsi tidak berhasil.

basic_filebuf::p backfail

Mencoba mengembalikan elemen ke aliran input, lalu menjadikannya elemen saat ini (ditujukkan ke penunjuk berikutnya).

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

Parameter

_Meta
Karakter yang akan dimasukkan ke dalam buffer, atau traits_type::eof.

Tampilkan Nilai

Jika fungsi tidak berhasil, fungsi akan mengembalikan traits_type::eof. Jika tidak, ia kembali traits_type::not_eof(_Meta).

Keterangan

Fungsi anggota virtual yang dilindungi mengembalikan elemen ke dalam buffer input dan kemudian menjadikannya elemen saat ini (ditujukkan ke penunjuk berikutnya). Jika _Meta == traits_type::eof, elemen untuk mendorong kembali secara efektif yang sudah ada di aliran sebelum elemen saat ini. Jika tidak, elemen tersebut digantikan oleh ch = traits_type::to_char_type(_Meta). Fungsi ini dapat mengembalikan elemen dengan berbagai cara:

  • putback Jika posisi tersedia, dan elemen yang disimpan di sana dibandingkan dengan ch, itu dapat mengurangi penunjuk berikutnya untuk buffer input.

  • Jika fungsi dapat membuat putback posisi tersedia, fungsi dapat melakukannya, mengatur penunjuk berikutnya untuk mengarah ke posisi tersebut, dan menyimpan ch di posisi tersebut.

  • Jika fungsi dapat mendorong kembali elemen ke aliran input, fungsi dapat melakukannya, seperti dengan memanggil ungetc elemen jenis char.

basic_filebuf::p os_type

Membuat jenis ini dalam basic_filebuf cakupan yang setara dengan jenis nama yang sama dalam Tr cakupan.

typedef typename traits_type::pos_type pos_type;

basic_filebuf::seekoff

Mencoba mengubah posisi saat ini untuk aliran yang dikontrol.

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

Parameter

_Off
Posisi yang dicari relatif terhadap _Way.

_Jalan
Titik awal untuk operasi offset. Lihat seekdir untuk kemungkinan nilai.

_Yang mana
Menentukan mode untuk posisi penunjuk. Defaultnya adalah memungkinkan Anda mengubah posisi baca dan tulis.

Tampilkan Nilai

Mengembalikan posisi baru atau posisi aliran yang tidak valid.

Keterangan

Fungsi anggota virtual yang dilindungi mencoba mengubah posisi saat ini untuk aliran yang dikontrol. Untuk objek kelas basic_filebuf<Char_T, Tr>, posisi aliran dapat diwakili oleh objek jenis fpos_t, yang menyimpan offset dan informasi status apa pun yang diperlukan untuk mengurai aliran yang luas. Offset nol mengacu pada elemen pertama aliran. (Objek jenis pos_type menyimpan setidaknya objek fpos_t .)

Untuk file yang dibuka untuk pembacaan dan penulisan, aliran input dan output diposisikan bersamaan. Untuk beralih antara menyisipkan dan mengekstrak, Anda harus memanggil atau pubseekoff pubseekpos. Panggilan ke pubseekoff (dan karenanya ke seekoff) memiliki berbagai batasan untuk aliran teks, aliran biner, dan aliran luas.

Jika penunjuk fp file adalah penunjuk null, fungsi gagal. Jika tidak, ia mencoba mengubah posisi aliran dengan memanggil fseek(fp, _Off, _Way). Jika fungsi tersebut berhasil dan posisi fposn yang dihasilkan dapat ditentukan dengan memanggil fgetpos(fp, &fposn), fungsi berhasil. Jika fungsi berhasil, fungsi akan mengembalikan nilai jenis pos_type yang berisi fposn. Jika tidak, ia mengembalikan posisi aliran yang tidak valid.

basic_filebuf::seekpos

Mencoba mengubah posisi saat ini untuk aliran yang dikontrol.

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

Parameter

_Sp
Posisi yang dicari.

_Yang mana
Menentukan mode untuk posisi penunjuk. Defaultnya adalah memungkinkan Anda mengubah posisi baca dan tulis.

Tampilkan Nilai

Jika penunjuk fp file adalah penunjuk null, fungsi gagal. Jika tidak, ia mencoba mengubah posisi aliran dengan memanggil fsetpos(fp, &fposn), di mana fposn adalah objek yang fpos_t disimpan di pos. Jika fungsi tersebut berhasil, fungsi akan mengembalikan pos. Jika tidak, ia mengembalikan posisi aliran yang tidak valid. Untuk menentukan apakah posisi aliran tidak valid, bandingkan nilai yang dikembalikan dengan pos_type(off_type(-1)).

Keterangan

Fungsi anggota virtual yang dilindungi mencoba mengubah posisi saat ini untuk aliran yang dikontrol. Untuk objek kelas basic_filebuf<Char_T, Tr>, posisi aliran dapat diwakili oleh objek jenis fpos_t, yang menyimpan offset dan informasi status apa pun yang diperlukan untuk mengurai aliran yang luas. Offset nol mengacu pada elemen pertama aliran. (Objek jenis pos_type menyimpan setidaknya objek fpos_t .)

Untuk file yang dibuka untuk pembacaan dan penulisan, aliran input dan output diposisikan bersamaan. Untuk beralih antara menyisipkan dan mengekstrak, Anda harus memanggil atau pubseekoff pubseekpos. Panggilan ke pubseekoff (dan ke ) memiliki berbagai batasan seekoffuntuk aliran teks, aliran biner, dan aliran luas.

Untuk aliran lebar, jika ada penyisipan yang terjadi sejak aliran dibuka, atau sejak panggilan terakhir ke streampos, fungsi memanggil overflow. Ini juga menyisipkan urutan apa pun yang diperlukan untuk memulihkan status konversi awal, dengan menggunakan faset fac konversi file untuk memanggil fac.unshift sesuai kebutuhan. Setiap elemen byte jenis char yang dihasilkan ditulis ke aliran terkait yang ditunjuk oleh penunjuk fp file seolah-olah oleh panggilan formulir fputc(byte, fp)berturut-turut . Jika panggilan ke fac.unshift atau penulisan apa pun gagal, fungsi tidak berhasil.

basic_filebuf::setbuf

Melakukan operasi khusus untuk setiap buffer aliran turunan.

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

Parameter

_Buffer
Penunjuk ke buffer.

count
Ukuran buffer.

Tampilkan Nilai

Fungsi anggota yang dilindungi mengembalikan nol jika penunjuk fp file adalah penunjuk null.

Keterangan

setbufsetvbuf( fp, (char*) _Buffer, _IOFBF, count * sizeof( Char_T)) panggilan untuk menawarkan array count elemen yang dimulai pada _Buffer sebagai buffer untuk aliran. Jika fungsi tersebut mengembalikan nilai bukan nol, fungsi mengembalikan penunjuk null. Jika tidak, ia kembali ke kesuksesan this sinyal.

basic_filebuf::swap

Menukar isi ini basic_filebuf dengan konten yang disediakan basic_filebuf.

void swap(basic_filebuf& right);

Parameter

right
Referensi lvalue ke lainnya basic_filebuf.

basic_filebuf::sync

Mencoba menyinkronkan aliran terkontrol dengan aliran eksternal terkait.

virtual int sync();

Tampilkan Nilai

Mengembalikan nol jika penunjuk fp file adalah penunjuk null. Jika tidak, ia mengembalikan nol hanya jika panggilan ke luapan dan fflush(fp) berhasil menghapus output yang tertunda ke aliran.

basic_filebuf::traits_type

Mengaitkan nama jenis dengan Tr parameter templat.

typedef Tr traits_type;

basic_filebuf::underflow

Mengekstrak elemen saat ini dari aliran input.

virtual int_type underflow();

Tampilkan Nilai

Jika fungsi tidak berhasil, fungsi akan mengembalikan traits_type::eof. Jika tidak, ia mengembalikan ch, dikonversi seperti yang dijelaskan di bagian Keterangan.

Keterangan

Fungsi anggota virtual yang dilindungi mencoba mengekstrak elemen ch saat ini dari aliran input, dan mengembalikan elemen sebagaito_int_typetraits_type::(ch) . Ini dapat melakukannya dengan berbagai cara:

  • Jika posisi baca tersedia, diperlukan ch sebagai elemen yang disimpan dalam posisi baca dan memajukan penunjuk berikutnya untuk buffer input.

  • Ini dapat membaca satu atau beberapa elemen jenis char, seolah-olah dengan panggilan formulir fgetc(fp)berturut-turut , dan mengonversinya menjadi elemen ch jenis Char_T dengan menggunakan faset fac konversi file untuk memanggil fac.in sesuai kebutuhan. Jika ada baca atau konversi yang gagal, fungsi tidak berhasil.

Lihat juga

<fstream>
Keamanan utas di Pustaka Standar C++
Pemrograman iostream
Konvensi iostreams