Вы не можете написать структуру, содержащую вектор, используя необработанный байтовый ввод-вывод. Класс vector представляет собой небольшую структуру данных, которая хранит свои данные где-то в куче, а не в структуре. Это потому, что структура не может заранее «знать», сколько объектов она будет содержать.
Вы можете записать содержимое вектора так:
os.write((const char*)&s.id, sizeof(s.id));
os.write((const char*)&s.neighbors, sizeof(s.neighbors));
os.write((const char*)&s.objects[0], size);
Относительно того, почему файл занимает всего 4,7 КБ, я не знаю. Распечатайте size
, чтобы увидеть, сколько данных записывается. Я проверил код после вышеуказанных изменений, и он работает.
Кроме того, вам не нужно s.objects.resize(s.objects.size());
. Изменение размера вектора до его собственного размера является излишним.
Также обратите внимание на небольшую причуду. sizeof (object) == 16 в моей архитектуре, что больше, чем требуется для вышеуказанной структуры (2 + 4 + 4 + 2 + 1 == 13). Компилятор обычно добавляет заполнение, чтобы гарантировать, что примитивы размером 2 n выровнены по границе 2 n , что приводит к отверстия внутри каждой структуры и между структурами в векторе.
Следствием этого является то, что вы записываете дополнительные байты в файл, некоторые из которых являются случайным шумом. В сборках без отладки эти дыры никогда не заполняются чем-либо, поэтому они просто содержат мусор, который был в этом месте памяти до того, как он был выделен для ваших целей. Поэтому, если вы запустите программу дважды, возможно, что эти два файла не будут идентичны.