Russian Qt Forum

Qt => Общие вопросы => Тема начата: INGIO от Январь 30, 2009, 17:19



Название: Сохранение произвольного типа данных в файл, где всё хранится списком.
Отправлено: 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, если нужен произвольный доступ.