Вектор векторов в памяти выглядит не так:
|---------|---------|---------|---------|... (where "-" is one element)
0 1 2 3
А вот так:
|->0x48267a70|->0x894753b2|->0xb8cc92f0|->0x22d8cc71|...
(каждый вектор имеет указатель на свои внутренние данные, который будетперераспределить, когда рост превысит объем уже выделенной памяти).
Что вы сделали, вы взяли адрес внутреннего буфера первого вектора и переиндексировали его после исчерпания его элементов.Это неопределенное поведение, и поэтому в вашем файле есть ненужная память (но у вас была одинаковая вероятность сбоя программы).
Вы можете записать сохраненные векторы один за другим в файл, выполняя итерации.В более идиоматическом стиле C ++:
std::ofstream outfile("e:\\test.dat", std::ios::binary | std::ios::out);
if (!outfile.is_open()) ... // handle error
for (std::vector<std::vector<unsigned char> >::iterator it = v2D.begin();
it != v2D.end();
++it)
{
outfile.write(&it->front(), it->size() * sizeof(unsigned char));
}
Или в C ++ 11 вышеприведенное будет выглядеть следующим образом:
for (auto& it : v2D)
{
outfile.write(&it.front(), it.size() * sizeof(unsigned char));
}
В обоих случаях ios_base::failure
исключения должны обрабатываться.