Ваши объекты должны быть сериализуемыми .Подумайте о том, что на самом деле происходит под капотом, когда вы пытаетесь таким образом записать заголовок связанного списка - конечно, он просто пишет первый узел;функция write
понятия не имеет о чем пишет , поэтому она не имеет понятия, как следовать указателям на следующий узел и записывать это тоже.Он просто видит биты и записывает их до конца текущего объекта, который в данном случае является просто первым узлом.
Сериализация в основном означает для каждого нетривиального типа написание метода, который упаковывает этовведите плоский поток байтов, пригодный для записи (и в идеале также второй метод, который считывает этот формат обратно).
Теперь ваш вопрос помечен как C ++, но код, который вы написали, очень C-лайк.Обычный способ реализовать сериализуемый объект в C ++ - переопределить оператор <<
с аргументом std::ostream&
и возвращаемым значением, например
std::ostream& MyType::operator<< (std::ostream& out)
{
// Here, write out the logical contents of this object in whatever format you
// feel is appropriate (keep in mind endianness and floating point representation
// if you want portability!)
return out << this->field1 << this->field2 << this->field3;
}
И симметрично
std::istream& MyType::operator>> (std::istream& in)
{
// Here, read in the logical contents of this object in the same format
return in >> this->field1 >> this->field2 >> this->field3;
}
Теперь, вы можете просто сделать что-то вроде этого:
MyType t;
std::ofstream outputFile("myoutputfile.dat");
outputFile << t;
Обратите внимание, что этот подход переопределения операторов потока означает, что, если, например, MyType::field2
окажется сам по себе сложным объектом, он все равно будет сериализован идесериализовано должным образом в вышеприведенном коде до тех пор, пока его потоковые операторы будут переопределены.
Но если вы хотите продолжить использовать файловый ввод-вывод в стиле C, как в исходном посте, ничего не происходитне будет так чисто.Если ваш код действительно должен быть C ++, вы должны использовать библиотеки iostream для ввода / вывода файлов.