Прочитайте N байтов из файла и добавьте их в std:: vector

Я хочу прочитать N байты данных из потока файлов и добавьте их в вектор. Итак, предположим, у нас есть

basic_ifstream<uint8_t> myFileStream;

и a

vector<uint8_t> myBuffer;

в настоящее время я делаю что-то вроде этого:

myBuffer.reserve(N);
for (int i=0; i<N; ++i)
{
    uint8_t tmpByte;
    myFileStream.read(&tmpByte, 1);
    myBuffer.push_back(tmpByte);
}

но это очень медленно.

теперь я попытался отпустить myFileStream.read скопировать данные непосредственно в вектор. Поскольку вектор хранит свои элементы в непрерывном месте хранения, я подумал, что что-то вроде этого должно быть возможно:

uint8_t* ptr = &myBuffer.back(); // there is already some elements in the buffer (I know)
ptr++; // first element after existing data
myBuffer.resize(myBuffer.size() + N);
myFileStream.read(ptr, N);

но с этим я получаю ошибку времени выполнения (повреждение кучи). Что не так с этим решением? Или есть лучший способ делать это?

1 ответов


ваша проблема в том, что resize может потребоваться перераспределить весь вектор и, таким образом, аннулировать предыдущий ptr. Вам нужно взять указатель только после resize.

std::size_t oldSize = myBuffer.size();
// resize first
myBuffer.resize(oldSize + N);
uint8_t* ptr = &myBuffer[oldSize]; // already first element after existing data
myFileStream.read(ptr, N);

обратите внимание, что в качестве бонуса эта реализация будет работать, даже если исходный вектор пуст (для N != 0, конечно).