Utilizzando std :: ifstream caricare in un array del tipo di dati in una struct std :: vector
Domanda
Sto lavorando su un caricatore bitmap in C ++ e quando si sposta dalla matrice stile C alla std :: vector ho incontrato un problema di solito di cui Google non sembra avere la risposta.
8 bit e 4 bit, bitmap contiene una tavolozza di colori. La tavolozza dei colori è blu, verde, rosso e componenti riservati ogni 1 byte di dimensione.
// Colour palette
struct BGRQuad
{
UInt8 blue;
UInt8 green;
UInt8 red;
UInt8 reserved;
};
Il problema che sto avendo è quando creo un vettore di struttura BGRQuad non posso più utilizzare la funzione di lettura ifstream per caricare i dati dal file direttamente nel vettore BGRQuad.
// This code throws an assert failure!
std::vector<BGRQuad> quads;
if (coloursUsed) // colour table available
{ // read in the colours
quads.reserve(coloursUsed);
inFile.read( reinterpret_cast<char*>(&quads[0]), coloursUsed * sizeof(BGRQuad) );
}
Qualcuno sa come leggere direttamente nel vettore senza dover creare un array di C e copiare i dati nel vettore BGRQuad?
Soluzione
È necessario utilizzare quads.resize(coloursUsed)
al posto di quads.reserve(coloursUsed)
. Riserva solo imposta la capacità dell'oggetto vettore ma non alloca memoria. Resize effettivamente allocare la memoria.