Использование std :: ifstream для загрузки массива типа данных struct в std :: vector - PullRequest
1 голос
/ 12 мая 2010

Я работаю над загрузчиком растровых изображений в C ++, и при переходе от массива стилей C к std :: vector я столкнулся с обычной проблемой, на которую, похоже, Google не нашел ответа.

8-битные и 4-битные, растровые изображения содержат цветовую палитру. Цветовая палитра имеет синий, зеленый, красный и зарезервированные компоненты, каждый размером 1 байт.

// Colour palette     
struct BGRQuad
{
     UInt8 blue; 
     UInt8 green; 
     UInt8 red; 
     UInt8 reserved; 
};

Проблема, с которой я сталкиваюсь, заключается в том, что при создании вектора структуры BGRQuad я больше не могу использовать функцию чтения ifstream для загрузки данных из файла непосредственно в вектор 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) ); 
}

Кто-нибудь знает, как читать непосредственно в вектор без необходимости создавать массив C и копировать данные в вектор BGRQuad?

1 Ответ

3 голосов
/ 12 мая 2010

Вам нужно использовать quads.resize(coloursUsed) вместо quads.reserve(coloursUsed). Резерв только устанавливает емкость векторного объекта, но не выделяет память. Изменение размера фактически выделит память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...