C ++ Сохранение и чтение объектов класса в файл и из файла. Какой самый лучший вариант?

0

Я хочу поместить свой двойной связанный список студентов в файл, а затем прочитать их. Мой двойной связанный список работает отлично, имеет каждую важную функцию. Для этой задачи может быть:

void addToChain(Student& BeeingAddedStudent);
void removeLastLink();
int  howManyLinks();
friend ostream& operator << (ostream&, Chain&);
friend ofstream& operator << (ofstream&, Chain&);

Студент выглядит так:

class Student
{
    string First;
    string Last;
    string* Classes; //array of classes student attend **(MAY BE PHRASES WITH FEW WORDS)**
    int Id, N; //student ID in university system and number of classes
    double Avg; //average grade

public:
    Student();
    Student(Student&);
    ~Student();

    ... //Full list of accessors

    Student& operator=(Student&);
    friend ostream& operator << (ostream&, Student&);
    friend ofstream& operator << (ofstream&, Student&);

}

Теперь, как вы думаете, лучший выбор для хранения этих объектов? Я не хочу иметь представление о файле. Не могли бы вы объяснить мне, как обменивать эти объекты с файлами? Я знаю основные команды, но не знаю, какие методы fstream я должен использовать. Вот, с чего я начал, поэтому ваш ответ может быть коротким и всеобъемлющим:

void Chain::saveToFile()
{
    ofstream file;
    file.open("Data.cha");
    file << *this;
    file.close();
}

void Chain::loadFromFile()
{
    while (StartLink->Essence != NULL)
        this->removeLastLink();
    ifstream file;
    file.open("Data.cha");
    Student current;
    while (!EOF)
    {
        //I have no idea, what should i put here...
    }

}

Как вы видите, я начал работать с текстовыми файлами, но если вы думаете, что это хорошо, я буду любить менять его на двоичный...

  • 0
    Используйте параметр режима ios :: binary.
Теги:
class
text
binary
filestream

1 ответ

1
Лучший ответ

"Лучший выбор" зависит от того, что вы высоко цените.

Вы можете добавить в класс /fromBinaryFile методы для своего класса, для которых вам нужно будет определить макет памяти массива байтов. Это должно быть самым быстрым.

Вы можете добавить методы /fromText к вашему классу, для чего вам придется определять текстовые представления. Это будет терпимо относиться к изменениям во внутреннем представлении, но преобразование в текст и из него требует дополнительных усилий. Он также (как правило) требует немного больше места на диске.

Вы можете определить макет XML и использовать некоторую библиотеку XML для чтения и записи XML-документов. Это самое сложное, но вы будете свободны от всех забот о текстовом представлении, и данные будут готовы к взаимозависимости с любой другой программой, способной читать/писать XML, и есть такие приятные вещи, как XSLT. В некотором смысле, это также будет терпимым к расширениям вашего класса.

  • 0
    Что вы подразумеваете под "макетом памяти байтового массива"? Я искал в Интернете, но не могу найти ничего подобного, извините. Не могли бы вы привести пример для объекта с: string S; int I; , как я могу это сделать?
  • 0
    Для int32_t вам понадобится 4 байта. Для std :: string используйте либо представление C, символы, за которыми следует '\ 0', либо длину (int8_t, int16_t), за которой следует столько символов, и так далее. Вы объединяете байты целых и строки в байтовый массив, длина которого может быть вычислена динамически. Затем составленный байтовый массив записывается в файл. - Да, это низкий уровень, но именно так работает сериализация (= процесс записи данных объекта в файл). - Вы можете предпочесть второй вариант.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню