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 .

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top