Название: Сохранение произвольного типа данных в файл, где всё хранится списком.
Отправлено: INGIO от Январь 30, 2009, 17:19
Добрый день! Встал вопрос... C++ (Qt) #include "contact.h" //сохранение в переменные контактных данных пользователя void Contact::setContactName(QString name) { contactName = name; } void Contact::setContactSurname(QString surname) { contactSurname = surname; } void Contact::setContactPatronymic(QString patronymic) { contactPatronymic = patronymic; } void Contact::setContactOrganization(QString organization) { contactOrganization = organization; } void Contact::setContactCountry(QString country) { contactCountry = country; } void Contact::setContactCity(QString city) { contactCity = city; } void Contact::setContactArea(QString area) { contactArea = area; } void Contact::setContactZipCode(QString zipCode) { contactZipCode = zipCode; } void Contact::setContactEmail(QString email) { contactEmail = email; } void Contact::setContactPhone(QString phone) { contactPhone = phone; } void Contact::setContactFax(QString fax) { contactFax = fax; } void Contact::setContactIcq(QString icq) { contactIcq = icq; } //взятие контактных данных из класса Contact QString Contact::getContactName() { return contactName; } QString Contact::getContactSurname() { return contactSurname; } QString Contact::getContactPatronymic() { return contactPatronymic; } QString Contact::getContactOrganization() { return contactOrganization; } QString Contact::getContactCountry() { return contactCountry; } QString Contact::getContactCity() { return contactCity; } QString Contact::getContactArea() { return contactArea; } QString Contact::getContactZipCode() { return contactZipCode; } QString Contact::getContactEmail() { return contactEmail; } QString Contact::getContactPhone() { return contactPhone; } QString Contact::getContactFax() { return contactFax; } QString Contact::getContactIcq() { return contactIcq; } QDataStream &operator<<(QDataStream &out, Contact &contact) { out << contact.getContactName() << contact.getContactSurname() << contact.getContactPatronymic() << contact.getContactOrganization() << contact.getContactCountry() << contact.getContactCity() << contact.getContactArea() << contact.getContactZipCode() << contact.getContactEmail() << contact.getContactPhone() << contact.getContactFax() << contact.getContactIcq(); return out; } QDataStream &operator>>(QDataStream &in, Contact &contact) { QString tmp; in >> tmp; contact.setContactName(tmp); in >> tmp; contact.setContactSurname(tmp); in >> tmp; contact.setContactPatronymic(tmp); in >> tmp; contact.setContactOrganization(tmp); in >> tmp; contact.setContactCountry(tmp); in >> tmp; contact.setContactCity(tmp); in >> tmp; contact.setContactArea(tmp); in >> tmp; contact.setContactZipCode(tmp); in >> tmp; contact.setContactEmail(tmp); in >> tmp; contact.setContactPhone(tmp); in >> tmp; contact.setContactFax(tmp); in >> tmp; contact.setContactIcq(tmp); return in; }
C++ (Qt) // файл определяющий класс контактной информации пользователя #ifndef CONTACT_H #define CONTACT_H #include <QString> #include <QDataStream> class Contact { public: //установка значиний переменных Контакта пользователя void setContactName(QString name); void setContactSurname(QString surname); void setContactPatronymic(QString patronymic); void setContactOrganization(QString organization); void setContactCountry(QString country); void setContactCity(QString city); void setContactArea(QString area); void setContactZipCode(QString zipCode); void setContactEmail(QString email); void setContactPhone(QString phone); void setContactFax(QString fax); void setContactIcq(QString icq); //взятие контактных данных пользователя QString getContactName(); QString getContactSurname(); QString getContactPatronymic(); QString getContactOrganization(); QString getContactCountry(); QString getContactCity(); QString getContactArea(); QString getContactZipCode(); QString getContactEmail(); QString getContactPhone(); QString getContactFax(); QString getContactIcq(); private: //Details QString contactName; QString contactSurname; QString contactPatronymic; QString contactOrganization; //Adress QString contactCountry; QString contactCity; QString contactArea; QString contactZipCode; // FeedBack QString contactEmail; QString contactPhone; QString contactFax; QString contactIcq; }; QDataStream &operator<<(QDataStream &out, Contact &contact); QDataStream &operator>>(QDataStream &in, Contact &contact); #endif
Подскажите, пожалуйста, как такой тип данных можно сохранять в один файл, в котором всё будет записываться списком... И обязательно нужно иметь произвольный доступ к каждому элементу. И так, чтобы при открытии файла не загружался весь файл сразу.
Название: Re: Сохранение произвольного типа данных в файл, где всё хранится списком.
Отправлено: Dendy от Январь 30, 2009, 18:07
При сериализации случайный доступ невозможен. Добраться до элемента можно только выгребя предыдущие данные, так как в методах << и >> могут быть сложные условия и циклы. Организовать случайный доступ, можно, например, как в ZIP-архиве, когда после сериализации данных в конец записывается "шапка" со смещениями где какой элемент находится. Кстати, промежуточный QString tmp можно не использовать. Для этого обьявите: C++ (Qt) friend QDataStream &operator<<(QDataStream &in, const Contact &contact); friend QDataStream &operator>>(QDataStream &in, Contact &contact);
И ещё у вас ошибка в коде: C++ (Qt) //contact.getContactIcq(); contact.getContactJabberID();
Название: Re: Сохранение произвольного типа данных в файл, где всё хранится списком.
Отправлено: Winstrol от Январь 31, 2009, 20:53
И еще не стоит забывать про SQLite, если нужен произвольный доступ.
|