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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 21:13   #1
Sheffdmb2010
 
Регистрация: 18.10.2011
Сообщений: 9
По умолчанию Запись объекта в файл

Доброго времени суток господа программисты. Проблема состоит в следующем, нужно записать объекты в файл и прочитать из файла.
Код:

#include "stdafx.h";
#include "iostream";
#include "stdio.h";
#include "string";
#include "locale.h";
#include "windows.h";
#include "fstream";


using namespace std;

class student
{
	
 string name;
 string surname;
 string parname;
 string info;
 int day;
 int mount;
 int age;
 int position;
 int number;
 
 public:
	// student(string _name,string _surname,string _parname,string _info,int _day,int _mount,int _age,int _number,int _position);
	 //~student();
	int i;
	void set_name(string n);
	void set_surname(string n);
	void set_parname(string n);
	void set_info(string n);
	void set_day(int n);
	void set_mount(int n);
	void set_age(int n);
	void set_position(int n);
	void set_number(int n);
	void get_student();
	long size_student();
	student();
	//~student();
};
    
      /*   student::student(string _name="",string _surname="",string _parname="",string _info="",int _day=0,int _mount=0,int _age=0,int _number=0,int _position=0)
		 {set_position(_position);
			 set_name(_name);
			 set_surname(_surname);
			 set_parname(_parname);
			 set_info(_info);
			 set_day(_day);
			 set_mount(_mount);
			 set_age(_age);
			 set_number(_number);}*/
    student::student(){};
	//student::~student(){};	
    void student::set_name(string n){name=n;};
	void student::set_surname(string n){surname=n;};
	void student::set_parname(string n){parname=n;};
	void student::set_info(string n){info=n;};
	void student::set_day(int n){day=n;};
	void student::set_mount(int n){mount=n;};
	void student::set_age(int n){age=n;};
	void student::set_position(int n){position=n;};
	void student::set_number(int n){number=n;};
	void student::get_student(){cout<<"|"<<position<<"|"<<surname<<"|"<<name<<"|"<<parname<<"|"<<info<<day<<"."<<mount<<"."<<age<<"|"<<number<<"\n";}
	
	
	
	student Vvodstud(){
	string name, surname, parname, info;
	int day, mount, age, position, number;
	student stud;
	cout<<"Введите имя студента \n";
	getline(cin,name);
	stud.set_name(name); cout<<endl;
	cout<<"Введите фамилию студента \n";
	getline(cin,surname);
	stud.set_surname(surname);cout<<endl;
	cout<<"Введите отчество студента \n";
	getline(cin,parname);
	stud.set_parname(parname);cout<<endl;
	cout<<"Введите информацию о студенте\n";
	getline(cin,info);
	stud.set_surname(info);cout<<endl;
	cout<<"Введите день, месяц, год рождения студента через Enter \n";
	cin>>day;
	stud.set_day(day);
	cin>>mount;
	stud.set_mount(mount);
	cin>>age;
	stud.set_age(age);cout<<endl;
	cout<<"Введите номер зачетки студента \n";
	cin>>number;
	stud.set_number(number);cout<<endl;
	stud.set_position(1);
	cout << "Студент \n";
	stud.get_student();
	cout<<"создан \n";
	//student stud(name,surname,parname,info,day,mount,age,number,position); 
     	    
	return(stud);
	};
	void Zapis(char* path,student stud){
		FILE *file;
		int razm;
		razm=sizeof(stud);
		file=fopen(path,"ba");//открываем файл для записи в конец файла
		fwrite(&razm,sizeof(int),1,file);//записываем размер объекта 
		fwrite(&stud,razm,1,file);//записываем объект
		fclose(file);
		cout<<"Файл создан \n";

	};
	void Chtenie(char *path,student stud){
		int razm;
		FILE *file;
		file=fopen(path,"br");
		while (!feof(file)){//пока не конец файла
		fread(&razm,sizeof(int),1,file);//считываем размер объекта
		fread(&stud,razm,1,file);//считываем объект
		stud.get_student();};//выводим на экран 
		fclose(file);
		
	};
  
int main() {
	//SetConsoleCP(1251);
	//SetConsoleOutputCP(1251);
	setlocale(LC_ALL,"Rus");
	student stud;
	char *path="base.bdsa";
	//string name, surname, parname, info;
	//int day, mount, age, position, number;
	stud=Vvodstud();
	Zapis(path,stud);
	Chtenie(path,stud);

	
	
	return 0;

}
Sheffdmb2010 вне форума Ответить с цитированием
Старый 24.05.2013, 22:02   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Что-то не работает??
Igor95 вне форума Ответить с цитированием
Старый 24.05.2013, 22:42   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Запись всего экземпляра класса целиком работает только для очень простых по строению структур. Что-то вроде:
Код:
struct Date
{
int dd, mm, yy;
bool LeapYear;
};
Не помню точно технические подробности, но весьма вероятно, что наличие функций-членов уже исключает возможность корректной записи/чтения. Объекты классов типа string тоже не смогут быть правильно записаны.

Выход - записывать значения каждого поля класса отдельно.

P.S. Пара замечаний по коду - лучше передавать объекты класса в функции по ссылке, причем в те функции, которые не должны менять значение аргумента - по константной. А те, которые должны - при передаче по значению просто не смогут этого сделать. Как, к примеру, ваша Chtenie. Кроме того, функции-члены, которые не меняют состояние объекта (типа get_student и size_student) настоятельно рекомендуется объявлять константными (с модификатором const).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 24.05.2013 в 22:49.
Гром вне форума Ответить с цитированием
Старый 27.05.2013, 10:45   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Гром правильно сказал:
Цитата:
Выход - записывать значения каждого поля класса отдельно.
Или же использовать библиотеки сериализации, которые могут записывать текущее состояние объектов, расположение в памяти и т.д. Я подозреваю, что данный метод будет неоправдано сложен в освоении, нежели построковая запись в файл.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 27.05.2013, 13:39   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Гром правильно сказал:

Или же использовать библиотеки сериализации, которые могут записывать текущее состояние объектов, расположение в памяти и т.д. Я подозреваю, что данный метод будет неоправдано сложен в освоении, нежели построковая запись в файл.
Существуют ли вообще библиотеки, способные сериализовать любой произвольный объект?
_Bers вне форума Ответить с цитированием
Старый 27.05.2013, 13:41   #6
Vzlom
Форумчанин
 
Регистрация: 11.02.2013
Сообщений: 155
По умолчанию

Вообще существуют, но их нужно вызывать и подключать отдельно.
Vzlom вне форума Ответить с цитированием
Старый 29.05.2013, 22:49   #7
Sheffdmb2010
 
Регистрация: 18.10.2011
Сообщений: 9
По умолчанию

Вот преобразовал функции в методы класса, но все равно в файл пишет не то что нужно.
Код:

#include "stdafx.h";
#include "iostream";
#include "stdio.h";
#include "string";
#include "locale.h";
#include "windows.h";
#include "fstream";


using namespace std;

class student
{
	
 string name;
 string surname;
 string parname;
 string info;
 int day;
 int mount;
 int age;
 int position;
 int number;
 
 public:
	// student(string _name,string _surname,string _parname,string _info,int _day,int _mount,int _age,int _number,int _position);
	 //~student();
	int i;
	void Vvodstud();
	void Zapis(char* path);
	void set_name(string n);
	void set_surname(string n);
	void set_parname(string n);
	void set_info(string n);
	void set_day(int n);
	void set_mount(int n);
	void set_age(int n);
	void set_position(int n);
	void set_number(int n);
	void get_student();
	long size_student();
	int get_day();
	int get_mount();
	int get_age();
	int get_position();
	int get_number();
	string get_name();
	string get_surname();
	string get_parname();
	string get_info();
	student();
	~student();
};
    
    
    student::student(){cout<<"Объект создан\n";};
	student::~student(){cout<<"Уничтожение\n";};	
    void student::set_name(string n){name=n;};
	void student::set_surname(string n){surname=n;};
	void student::set_parname(string n){parname=n;};
	void student::set_info(string n){info=n;};
	void student::set_day(int n){day=n;};
	void student::set_mount(int n){mount=n;};
	void student::set_age(int n){age=n;};
	void student::set_position(int n){position=n;};
	void student::set_number(int n){number=n;};
	void student::get_student(){cout<<"|"<<position<<"|"<<surname<<"|"<<name<<"|"<<parname<<"|"<<info<<day<<"."<<mount<<"."<<age<<"|"<<number<<"\n";}
	int student::get_day(){return(day);};
	int student::get_mount(){return(mount);};
	int student::get_age(){return(age);};
	int student::get_position(){return(position);};
	int student::get_number(){return(number);};
	string student::get_name(){return(name);};
	string student::get_surname(){return(surname);};
	string student::get_parname(){return(parname);};
	string student::get_info(){return(info);};
	
	
	
	void student::Vvodstud(){
	string name, surname, parname, info;
	int day, mount, age, position, number;
	//student stud;
	cout<<"Введите имя студента \n";
	getline(cin,name);
	this->set_name(name); cout<<endl;
	cout<<"Введите фамилию студента \n";
	getline(cin,surname);
	this->set_surname(surname);cout<<endl;
	cout<<"Введите отчество студента \n";
	getline(cin,parname);
	this->set_parname(parname);cout<<endl;
	cout<<"Введите информацию о студенте\n";
	getline(cin,info);
	this->set_surname(info);cout<<endl;
	cout<<"Введите день, месяц, год рождения студента через Enter \n";
	cin>>day;
	this->set_day(day);
	cin>>mount;
	this->set_mount(mount);
	cin>>age;
	this->set_age(age);cout<<endl;
	cout<<"Введите номер зачетки студента \n";
	cin>>number;
	this->set_number(number);cout<<endl;
	this->set_position(1);
	cout << "Студент \n";
	this->get_student();
	cout<<"создан \n";
	//student stud(name,surname,parname,info,day,mount,age,number,position); 
     	    
	//return(stud);
	};
	void student::Zapis(char* path){
		FILE *file;
		cout<<name;
		int s_name=strlen(name.c_str());
		
		int s_surname=strlen(surname.c_str());
		int s_parname=strlen(parname.c_str());
		int s_info=strlen(info.c_str());
		//razm=sizeof(stud);
		file=fopen(path,"ab");//открываем файл для записи в конец файла
		
		fwrite(&day,sizeof(int),1,file);//записываем размер объекта 
		fwrite(&mount,sizeof(int),1,file);
		fwrite(&age,sizeof(int),1,file);
		fwrite(&number,sizeof(int),1,file);
		fclose(file);		
		
		file=fopen(path,"at");
		fputs(name.c_str(),file);
		fputs(surname.c_str(),file);
		fputs(parname.c_str(),file);
		fputs(info.c_str(),file);
		fclose(file);

		file=fopen(path,"ab");//открываем файл для записи в конец файла
		fwrite(&s_name,sizeof(int),1,file);
		fwrite(&s_surname,sizeof(int),1,file);
		fwrite(&s_parname,sizeof(int),1,file);
		fwrite(&s_info,sizeof(int),1,file);
		fwrite(&position,sizeof(int),1,file);
		fclose(file);
		"Файл создан \n";
		
	};
	/*void Chtenie(char *path,student &stud){
		int razm;
		FILE *file;
		file=fopen(path,"br");
		while (!feof(file)){//пока не конец файла
		fread(&razm,sizeof(int),1,file);//считываем размер объекта
		fread(&stud,razm,1,file);//считываем объект
		stud.get_student();};//выводим на экран 
		fclose(file);*/
		
	//};
  
int main() {
	//SetConsoleCP(1251);
	//SetConsoleOutputCP(1251);
	setlocale(LC_ALL,"Rus");
	student stud;
	char *path="base.bdsa";

	//string name, surname, parname, info;
	//int day, mount, age, position, number;
	stud.Vvodstud();
	stud.Zapis(path);
	//Chtenie(path,stud);

	
	
	return 0;

}
Sheffdmb2010 вне форума Ответить с цитированием
Старый 29.05.2013, 23:41   #8
Sheffdmb2010
 
Регистрация: 18.10.2011
Сообщений: 9
По умолчанию

Все разобрался вроде. Дело было в fopen, заменил на fopen_s вроде пока как надо работает
Sheffdmb2010 вне форума Ответить с цитированием
Старый 31.05.2013, 19:34   #9
Sheffdmb2010
 
Регистрация: 18.10.2011
Сообщений: 9
По умолчанию

Вот накидал функцию чтения
Код:
int Chtenie(char *path){
		int s_name,s_parname,s_surname,s_info,
			day,mount,age,number,position;
		int pos=0;
		student stud;
		char *name="",*surname="",*parname="",*info="";
		
		
		
		FILE *file;
		if(_access(path,0)==-1){pos=1;cout<<"Fail Not Found\n";/*std::fclose(file);*/return pos;};
	    fopen_s(&file,path,"rb");
		/*if (!file)*/
		while (!feof(file)){//пока не конец файла
		fread(&day,sizeof(int),1,file);
		stud.set_day(day);
		fread(&mount,sizeof(int),1,file);
		stud.set_mount(mount);
    	fread(&age,sizeof(int),1,file);
		stud.set_age(age);
		fread(&number,sizeof(int),1,file);
		stud.set_number(number);
		fread(&s_name,sizeof(int),1,file);
		fread(&s_surname,sizeof(int),1,file);
		fread(&s_parname,sizeof(int),1,file);
		fread(&s_info,sizeof(int),1,file);
		fread(&position,sizeof(int),1,file);
		stud.set_position(position);
		

		
		
		int size=s_name+s_surname+s_parname+s_info;
		
		fgets(name,size,file);//Вот тут вылетает
				
		stud.set_name((const char*)name);
		fgets(surname,s_surname+1,file);
		stud.set_surname((const char*)surname);
		fgets(parname,s_parname+1,file);
		stud.set_parname((const char*)parname);
		fgets(info,s_info+1,file);
		stud.set_info((const char*)info);
		
		pos++;
		stud.get_student();};

		//student stud(ss_name,ss_surname,ss_parname,ss_info,day,mount,age,number,pos);}
		fclose(file);
		return pos;

		
	};
Вылетает когда доходит до fgets(name,s_name,file);
Файл записывал следующим образом:
писал в Int формате дату, номер зачетки, позицию,и отдельно размер в символах каждого поля, а потом каждое поле стринг.
Пишу и читаю в одной очередности. Что не так подскажите
Sheffdmb2010 вне форума Ответить с цитированием
Старый 31.05.2013, 19:54   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

_Bers
Цитата:
Существуют ли вообще библиотеки, способные сериализовать любой произвольный объект?
это ведь риторический вопрос? - если нет - то нет.
rrrFer вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись объекта в файла X@OC Общие вопросы Delphi 5 07.03.2013 01:06
Запись информации в файл в файл Anubys Win Api 0 04.11.2011 23:27
Запись объекта в файл CodeNOT PHP 5 22.06.2011 13:15
Сохранение объекта в файл garybaldi Помощь студентам 4 30.10.2009 09:55