Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2009, 18:23   #1
Feannewedd
Новичок
Джуниор
 
Регистрация: 28.06.2009
Сообщений: 5
Сообщение запись классов в бинарный файл

Код:
   1.
      class univer
   2.
      {
   3.
         int id;
   4.
         char* name;
   5.
         char* www;
   6.
         char* address;
   7.
      public:
   8.
         univer(int id1,char* name1, char* www1,char* address1){};
   9.
          int get_id(){return id;};
  10.
          char* get_name()const{};
  11.
          char* get_www()const{};
  12.
          char* get_address()const{};
  13.
         void set_name(char* name1){};
  14.
         void set_www(char* www1){};
  15.
         void set_gorod(char* address1){};
  16.
         //univer(const univer& temp){};
  17.
      };
  18.
      class table1
  19.
      {
  20.
         int num;
  21.
         univer** table;
  22.
      public:
  23.
         table1()
  24.
         {
  25.
             int temp;
  26.
             FILE *fp;
  27.
             fp = fopen("univer.db", "r");
  28.
             fread(&num,sizeof(int),1,fp);
  29.
             table=new univer*[num];
  30.
             if(num!=0)
  31.
             for(int i=0;i<num;i++)
  32.
             {
  33.
                 fread(&temp,sizeof(int),1,fp);
  34.
                 fread(&table[i],temp,1,fp);
  35.
             }
  36.
             fclose(fp);
  37.
         };
  38.
       
  39.
         void add_univer(char* name1, char* www1,char* address1)
  40.
         {};
  41.
         void del_univer(int id){univer** temp;temp=new univer*[num-1];for(int i=0;i<num;i++)
  42.
         {};
  43.
         void echo()
  44.
         {};
  45.
         void echo(int id)
  46.
         {};
  47.
         void echo_univer(int id){};
  48.
         int get_num(){};
  49.
         int get_id(int id){};
  50.
         void save()
  51.
         {
  52.
             int temp;int i;
  53.
             FILE *fp;
  54.
             fp = fopen("univer.db", "w");
  55.
             fwrite(num,sizeof(int),1,fp);
  56.
             if(num!=0)
  57.
             for(i=0;i<num;i++)
  58.
             {
  59.
                 temp=sizeof(table[i]);
  60.
                 fwrite(temp,sizeof(int),1,fp);
  61.
                 fwrite(table[i],temp,1,fp);
  62.
             }
  63.
             for(i=0;i<num;i++)
  64.
                 delete table[i];
  65.
             delete []table;
  66.
             fclose(fp);
  67.
         };
  68.
       
  69.
      };
выше привел код класса и контейнера соответствующего класса. Теперь трабла вот в чем как бы записывает и открывает потом. Но вот бред получается не выводится инфа а ошибка доступа к памяти Acces Volunt... именно после сохранения в файл, если в программе то все норм(сорри экспериментировал и про деструктор забыл, это не столь важно).

Модератор: тег CODE
спс

Последний раз редактировалось Feannewedd; 28.06.2009 в 21:17.
Feannewedd вне форума Ответить с цитированием
Старый 28.06.2009, 21:17   #2
Feannewedd
Новичок
Джуниор
 
Регистрация: 28.06.2009
Сообщений: 5
По умолчанию

АПаю тему по изменению кода относительно вопроса
Feannewedd вне форума Ответить с цитированием
Старый 28.06.2009, 22:08   #3
Feannewedd
Новичок
Джуниор
 
Регистрация: 28.06.2009
Сообщений: 5
По умолчанию

Код:
#include <iostream>
using namespace std;
class temp
{
	int id;
	char* name;
	int* mas;
public:
	temp(){id=1;name=new char[6];strcpy(name,"Denis\0");mas=new int[3];mas[0]=15;mas[1]=11;mas[2]=1989;};
//	int get_id()const{return id;};
//	char* get_name()const{return name;};
//	int* get_mas()const{return mas;};
//	temp(const temp& t){id=t.get_id();name=new char[strlen(t.get_name())];strcpy(name,t.get_name());int * p;p=t.get_mas();mas=new int[3];for(int i=0;i<3;i++)mas[i]=p[i];};
//	temp operator = (temp &t){id=t.get_id();name=new char[strlen(t.get_name())];strcpy(name,t.get_name());int * p;p=t.get_mas();mas=new int[3];for(int i=0;i<3;i++)mas[i]=p[i];};
	void echo(){cout<<endl<<id<<" "<<name<<" "<<mas[0]<<"."<<mas[1]<<"."<<mas[2]<<"...";};
	~temp(){delete[]name; delete[]mas;};
};
class container
{
	int num;
	temp** table;
public:
	container(int n){num=n;table=new temp*[n];for(int i=0;i<n;i++)table[i]=new temp;};
	void echo(){for(int i=0;i<num;i++)table[i]->echo();};
	void read()
	{
		FILE* fp;int t;
		fp=fopen("1.temp","r");
		fread(&num,sizeof(int),1,fp);
		table=new temp*[num];
		for(int i=0;i<num;i++)
		{

			fread(&t,sizeof(int),1,fp);
			fread(&table[i],t,1,fp);

		}
		fclose(fp);
	};
	void save(){
		FILE* fp;int t;
		fp = fopen("1.temp", "w");
		fwrite(&num,sizeof(int),1,fp);
		for(int i=0;i<num;i++)
		{
			t=sizeof(table[i]);
			fwrite(&t,sizeof(int),1,fp);
			fwrite(table[i],t,1,fp);
		}
		fclose(fp);
	};
	~container(){for(int i=0;i<num;i++)delete table[i];delete[]table;};
};
void main()
{
	container a1(5);
	a1.echo();
	a1.save();
	a1.read();
	a1.echo();
}
так решил упростить пример Вот почему не хочет нормально записывать или считывать (
Feannewedd вне форума Ответить с цитированием
Старый 28.06.2009, 23:04   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Указатель - есть целое число. У Вас эти "числа" (аттрибуты класса temp: name и mas) записываются в файл, только при чтении из файла по этому, прочтенному из файла указателю на ячейку памяти, будет неизвестно что. Реализуйте методы чтения и записи для класса, содержащего указатели, чтобы всё было корректно. В общем, в файл записываются адреса, а не значения.
pu4koff вне форума Ответить с цитированием
Старый 28.06.2009, 23:35   #5
Feannewedd
Новичок
Джуниор
 
Регистрация: 28.06.2009
Сообщений: 5
По умолчанию

Реализуйте методы чтения и записи для класса, содержащего указатели, чтобы всё было корректно. - это означает записывать отдельно дин массивы char & int ? Или как я не совсем понимаю
Feannewedd вне форума Ответить с цитированием
Старый 29.06.2009, 00:08   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Если я ничего не упустил, то сейчас, напрмиер, аттрибут: char* name; записывается в файл как указатель на строку, т.е. 4-байтовое целое число. Надо чтение из файла сделать вида:
прочитать из файла длину строки
выделить память под эту строку
считать нужное количество байт из файла
ну и соответствующим образом сделать запись в файл
ну и так же mas записывать/читать
pu4koff вне форума Ответить с цитированием
Старый 29.06.2009, 10:11   #7
Feannewedd
Новичок
Джуниор
 
Регистрация: 28.06.2009
Сообщений: 5
По умолчанию

Код:
#include <iostream>
using namespace std;
class temp
{
	int id;
	char* name;
	int* mas;
public:
	temp(){id=1;name=new char[6];strcpy(name,"Denis\0");mas=new int[3];mas[0]=15;mas[1]=11;mas[2]=1989;};
	temp(int id1,char* name1,int*mas1){id=id1;int t;t=strlen(name1);name=new char[t];strcpy(name,name1);mas=new int[3];for(t=0;t<3;t++)mas[t]=mas1[t];};
	int get_id()const{return id;};
	char* get_name()const{return name;};
	int* get_mas()const{return mas;};
//	temp(const temp& t){id=t.get_id();name=new char[strlen(t.get_name())];strcpy(name,t.get_name());int * p;p=t.get_mas();mas=new int[3];for(int i=0;i<3;i++)mas[i]=p[i];};
//	temp operator = (temp &t){id=t.get_id();name=new char[strlen(t.get_name())];strcpy(name,t.get_name());int * p;p=t.get_mas();mas=new int[3];for(int i=0;i<3;i++)mas[i]=p[i];};
	void echo(){cout<<endl<<id<<" "<<name<<" "<<mas[0]<<"."<<mas[1]<<"."<<mas[2]<<"...";};
};
class container
{
	int num;
	temp** table;
public:
	container(int n){num=n;table=new temp*[n];for(int i=0;i<n;i++)table[i]=new temp;};
	void echo(){for(int i=0;i<num;i++)table[i]->echo();};
	void read()
	{
		FILE* fp;int temp1,i,t;char* name;int* mas;int id;
		fp=fopen("1.temp","r");
		fread(&num,sizeof(int),1,fp);
		for(i=0;i<num;i++)
			delete table[i];
		delete[]table;
		table=new temp*[num];
		for(i=0;i<num;i++)
		{
			fread(&id,sizeof(int),1,fp);
			fread(&temp1,sizeof(int),1,fp);
			name=new char[temp1+1];
			fread(name,temp1,1,fp);
			name[temp1]='\0';
			fread(&temp1,sizeof(int),1,fp);
			mas=new int[temp1/sizeof(int)];
			for(t=0;t<3;t++)
				fread(&(mas[t]),sizeof(int),1,fp);
			table[i]=new temp(id,name,mas);
		}
		fclose(fp);
	};
	void save(){
		FILE* fp;int temp1;char* p;int* k;
		fp = fopen("1.temp", "w");
		fwrite(&num,sizeof(int),1,fp);
		for(int i=0;i<num;i++)
		{
			temp1=table[i]->get_id();
			fwrite(&temp1,sizeof(int),1,fp);
			temp1=strlen(table[i]->get_name());
			fwrite(&temp1,sizeof(int),1,fp);
			p=new char[temp1];
			strcpy(p,table[i]->get_name());
			fwrite(p,temp1,1,fp);
			k=table[i]->get_mas();
			temp1=sizeof(int)*3;
			fwrite(&temp1,sizeof(int),1,fp);
			for(temp1=0;temp1<3;temp1++)
				fwrite(&(k[temp1]),sizeof(int),1,fp);
		}
		fclose(fp);
	};
	~container(){for(int i=0;i<num;i++)delete table[i];delete[]table;};
};
void main()
{
	container a1(5);
	a1.echo();
	a1.save();
	a1.read();
	a1.echo();
}
Вот что получилось. Вроде 100% работает thx

Последний раз редактировалось Feannewedd; 29.06.2009 в 10:40.
Feannewedd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на бинарный файл Many man Помощь студентам 3 10.05.2009 19:41
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
Бинарный файл mchip Microsoft Office Excel 10 05.03.2009 19:10
Бинарный файл Bayazet Общие вопросы Delphi 1 04.03.2009 16:39