Come posso usare basic_filebuf con un tipo di elemento diverso da char?
Domanda
Dire che voglio leggere il contenuto di un file usando basic_filebuf
. Ho un tipo chiamato boost :: uintmax_t
che ha una dimensione di 8 byte
. Sto cercando di scrivere quanto segue:
typedef basic_filebuf<uintmax_t> file;
typedef istreambuf_iterator<uintmax_t> ifile;
file f;
vector<uintmax_t> data, buf(2);
f.open("test.txt", std::ios::in | std::ios::binary);
f.pubsetbuf(&buf[0], 1024);
ifile start(&f), end;
while(start != end)
{
data.push_back(*start);
start++;
}
Il problema è che alcuni dei byte
vengono letti, altri no. Ad esempio, supponiamo che ci siano 9 byte
nel file numerato 1-9
:
|1|2|3|4|5|6|7|8|9|
Quando eseguo il codice sopra, solo un elemento viene reinserito in dati
, che contiene 4 byte
solo dai dati originali in f
:
[0|0|0|0|4|3|2|1] --> only element in [data]
Cosa sto facendo di sbagliato? Questa è la prima volta che uso basic_filebuf
direttamente, anche se so come usare filebuf
.
Soluzione
Un basic_filebuf si occupa di un "quot" interno " tipo di carattere e un "esterno" uno. L '"esterno" uno è il contenuto del file ed è sempre byte. L '"interno" uno è il parametro template ed è quello utilizzato nella sua interfaccia con il programma. Per convertire tra i due, basic_filebuf usa la sfaccettatura codecvt delle sue impostazioni internazionali.
Quindi se vuoi che scriva direttamente i byte che gli dai, hai due opzioni:
- usa un "degenerato" codecvt che si colloca solo tra il "interno" e "esterno" codifiche invece di provare a eseguire una conversione.
- usa un basic_filebuf, assicurati di usare il " classico " locale e esegui il cast per incantarti
Altri suggerimenti
Gli oggetti di tipo basic_filebuf sono creato con un buffer interno di digitare char * indipendentemente da char_type specificato dal tipo parametro Elem. Ciò significa che a Stringa Unicode (contenente wchar_t caratteri) saranno convertiti in un Stringa ANSI (contenente char caratteri) prima che venga scritto il buffer interno. Per memorizzare Unicode stringhe nel buffer, creane una nuova buffer di tipo wchar_t e impostarlo utilizzando basic_streambuf :: pubsetbuf () metodo.
da http://msdn.microsoft.com /en-us/library/tzf8k3z8(VS.80).aspx