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