Как записать объект со связанным списком в файл - PullRequest
0 голосов
/ 24 марта 2012
void writeFile(){
    Employer *temp = head;
    while (temp != NULL)
    {
        temp->tryWrite();//Employee's display method called here
        temp = temp->getNext();
    }
}

void main(){
    EmployerList em;
    em.AddNode("des@yahoo.com", "LIME", "Manager", "ming", "ding", "Newston", "43", "873");
    em.AddNode("sw@gmail.com", "NOKIA", "CEO", "rew", "nbv", "Europe", "0411-789-6548", "985-257-1111"); 
    //em.writeFile();
}

Я пытаюсь записать связанный список в файл как объект, а не в единственном числе, как в функции tryWrite. любая помощь?

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Короткий ответ: «Нет, вы не можете этого сделать».

Связанный список, в значительной степени по определению, содержит указатели. По крайней мере, для длительного хранения (т. Е. Всего, что сохранилось за пределами одного выполнения программы), вы не можете получить ничего значимого, сохранив указатель на диск и затем считав его обратно.

Сериализация структур данных, содержащих указатели, обычно требует "преследования" этих указателей и некоторого "выравнивания" структуры. Для линейного связанного списка вы, вероятно, просто хотите записать узлы в порядке. Другая возможность - заменить смещения в файле указателями на память. Это в первую очередь полезно, если вам нужно поддерживать структуру диска того же типа (например, вам нужно дерево, которым вы можете манипулировать на диске как фактическое дерево, а не просто последовательность записей).

В любом случае, если вы пойдете на это, то хранение исходных данных вряд ли будет полезным.

0 голосов
/ 21 апреля 2012

Если вы хотите сохранить связанный список на диске точно так же, как хранится в памяти, вы не сможете. Поскольку указатели в связанном списке «изменчивы», то, на что они указывают, может сильно отличаться, когда вы запускаете приложение в разное время. Это означает, что бессмысленно сохранять сами указатели.

Но вы можете сохранить узлы в связанном списке, а также их отношения (которые ранее поддерживались указателями) к диску. Если вы используете один связанный список, просто сохраняйте узлы один за другим, от головы до конца.

0 голосов
/ 24 марта 2012

Код, который вы показываете, является неполным и не компилируется.Вам не хватает объявлений для переменных членов класса.Ваш конструктор для EmployerList, вероятно, должен взять const Employer & и сохранить его;он не должен иметь дело со всеми переменными, используемыми для инициализации Employer.

Запись связанного списка в файл является довольно сложной задачей.Вы не можете многозначительно писать указатели;Вы должны записать значения данных для каждого элемента в стандартизированном, легко читаемом формате.Вы используете близость в файле, чтобы указать отношения «следующий» (и «предыдущий»).Этот процесс называется «сериализация» на выходе и «десериализация» на входе.


Эта идиома:

    Employer *node = new Employer(Email, cName, pos, fName, lName, addr, tHome, tMobile);  

    //if memory was sucessfully allocated
    if (node != NULL)

является архаичной (до стандарта, то есть до 1998 года)C ++.Вы не вызывали распределитель «без броска»;если распределение не удалось, было сгенерировано исключение.Поэтому проверка распределения избыточна.

Это не вызывает прямых проблем;тест просто бесполезен (и делает ваш код более нужным).Если ваш учебник использует эту технику, вы, вероятно, должны получить более новый учебник.

(Я также отмечаю, что мне пришлось исправить интервал, чтобы код был согласованным; согласованность в программировании очень важна.)

...