Прочитать N байтов из файла и добавить их в std :: vector - PullRequest
6 голосов
/ 09 сентября 2011

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

basic_ifstream<uint8_t> myFileStream;

и

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 Ответ

13 голосов
/ 09 сентября 2011

Ваша проблема в том, что 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, конечно).

...