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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2016, 10:48   #1
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию Ошибка при чтении из файла

Здравствуйте! При попытке чтения из файла, вылетает ошибка: "Необработанное исключение по адресу 0x01196181 в films.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x004BBCA8."
Пытаюсь считать вектор классов. При этом если загружать данные после сохранения, не закрывая программу, считывается все нормально и без ошибок (сделал вывод в функции загрузки и все выводит нормально). Но если программу закрыть, открыть заново и попытаться загрузить файл, вылетает эта ошибка. Ниже класс и функции сохранения/загрузки:
Код:
class Film     //фильм
{
public:
	char *name;   //название фильма
	int year;      //год выпуска
	char *country;  //страна создания
	bool children;   //доступность детям
	char *cinem;   //кинотеатр
public:
	Film(void);
	Film(char *Name, int Year, char *Country, bool ch);
	void vvod_film();         //ввод информации о фильме
	void vivod_film();        //вывод информации о фильме
	char *getCountry();      
	char *getName();
	int getYear();
	bool getChild();
	~Film(void);
};
Код:
void Dialog::Save()
{
	int w = 0;  //кол-во фильмов
	for (int i=0; i<spis_cin.size(); i++)
		w += spis_cin[i].spis_films.size();
	FILE *in; 
	in = fopen ("spis_cin.dat", "wb");    
	fwrite (&w, sizeof(int), 1, in); 
	for (int i=0; i<spis_cin.size(); i++)
		for (int j=0; j<spis_cin[i].spis_films.size(); j++)
		{
			fwrite (&spis_cin[i].spis_films[j], sizeof(Film), 1, in);  
		}
	fclose(in);
	
}

void Dialog::Load()
{
	int w, n;
	Film X;
	FILE *in;    
	in = fopen ("spis_cin.dat", "rb");   
	fread (&n, sizeof(int), 1, in);
	cout << n;
	for (int i=0; i<n; i++)
	{
		X.name = new char[];
		X.country = new char[];
		X.cinem = new char[];
		w = fread (&X, sizeof(Film), 1, in);  
		if (w != 1)
			break;
		cout << X.name;
		//spis_film.push_back(X);
		X.vivod_film();
	}
	fclose(in);
	
	system ("pause");
}
Uefa вне форума Ответить с цитированием
Старый 09.01.2016, 11:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

И сколько по вашему выделится памяти на new char[] ?
p51x вне форума Ответить с цитированием
Старый 09.01.2016, 11:37   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
w = fread (&X, sizeof(Film), 1, in);
Класс без серализации читать? О_о
А ты смельчак...
Ты бы лучше сделал структуру с полями, и считывал в нее. Структуру эту поместил бы в класс как свойство, тогда другое дело.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2016, 11:58   #4
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Код:
void Dialog::Save()
{
	int p, p2, p3, w = 0;  //кол-во фильмов
	for (int i=0; i<spis_cin.size(); i++)
		w += spis_cin[i].spis_films.size();
	FILE *in; 
	in = fopen ("spis_cin.dat", "wb");    
	fwrite (&w, sizeof(int), 1, in); 
	for (int i=0; i<spis_cin.size(); i++)
		for (int j=0; j<spis_cin[i].spis_films.size(); j++)
		{
			
			p=sizeof(spis_cin[i].spis_films[j].name);
			fwrite (&p, sizeof(int), 1, in); 
			p2=sizeof(spis_cin[i].spis_films[j].country);
			fwrite (&p2, sizeof(int), 1, in); 
			p3=sizeof(spis_cin[i].spis_films[j].cinem);
			fwrite (&p3, sizeof(int), 1, in); 

			fwrite (spis_cin[i].spis_films[j].name, sizeof (char)*sizeof(spis_cin[i].spis_films[j].name), 1, in);  
			fwrite (&spis_cin[i].spis_films[j].year, sizeof(int), 1, in);  
			fwrite (spis_cin[i].spis_films[j].country, sizeof (char)*sizeof(spis_cin[i].spis_films[j].country), 1, in);  
			fwrite (&spis_cin[i].spis_films[j].children, sizeof(bool), 1, in);  
			fwrite (spis_cin[i].spis_films[j].cinem, sizeof (char)*sizeof(spis_cin[i].spis_films[j].cinem), 1, in);  
		}
	fclose(in);
	
}

void Dialog::Load()
{
	int w, n, p, p2, p3;
	Film X;
	FILE *in;    
	in = fopen ("spis_cin.dat", "rb");   
	fread (&n, sizeof(int), 1, in);
	for (int i=0; i<n; i++)
	{
		X.name = new char[];
		X.country = new char[];
		X.cinem = new char[];
	
		fread (&p, sizeof(int), 1, in);
		fread (&p2, sizeof(int), 1, in);
		fread (&p3, sizeof(int), 1, in);

		fread (X.name, sizeof(char)*p, 1, in);
		fread (&X.year, sizeof(int), 1, in);
		w = fread (X.country, sizeof(char)*p2, 1, in);
		w = fread (&X.children, sizeof(bool), 1, in);
		w = fread (X.cinem, sizeof(char)*p3, 1, in);
		X.vivod_film();
		spis_film.push_back(X);
	}
	fclose(in);
	
		
	system ("pause");
}
Вот так сделал. Сначала записываю размеры всех строк, затем поля класса. В загрузке считываю размеры и при считывании самих строк устанавливаю размер считывания sizeof(char)*размер записанной строки, но получилось что-то не так. Вместо matrica, выводит matr<<<<<<<<<<<оюою. Подскажите как правильно передать размеры строк.

Последний раз редактировалось Uefa; 09.01.2016 в 12:22.
Uefa вне форума Ответить с цитированием
Старый 09.01.2016, 12:27   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Да не с передачей у вас проблемы. Прочитайте еще раз мой пост, и еще раз, а потом посмотрить хоть в дебаге сколько выделилось памяти.
p51x вне форума Ответить с цитированием
Старый 09.01.2016, 12:41   #6
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Да не с передачей у вас проблемы. Прочитайте еще раз мой пост, и еще раз, а потом посмотрить хоть в дебаге сколько выделилось памяти.
Так как в таком случае выделять память под считываемые данные?

Цитата:
Сообщение от p51x Посмотреть сообщение
Да не с передачей у вас проблемы. Прочитайте еще раз мой пост, и еще раз, а потом посмотрить хоть в дебаге сколько выделилось памяти.
Код:
void Dialog::Save()
{
	int p, p2, p3, w = 0;  //кол-во фильмов
	for (int i=0; i<spis_cin.size(); i++)
		w += spis_cin[i].spis_films.size();
	FILE *in; 
	in = fopen ("spis_cin.dat", "wb");    
	fwrite (&w, sizeof(int), 1, in); 
	for (int i=0; i<spis_cin.size(); i++)
		for (int j=0; j<spis_cin[i].spis_films.size(); j++)
		{
			//fwrite (&spis_cin[i].spis_films[j], sizeof(Film), 1, in);  
			p=strlen(spis_cin[i].spis_films[j].name);
			fwrite (&p, sizeof(int), 1, in); 
			p2=strlen(spis_cin[i].spis_films[j].country);
			fwrite (&p2, sizeof(int), 1, in); 
			p3=strlen(spis_cin[i].spis_films[j].cinem);
			fwrite (&p3, sizeof(int), 1, in); 

			fwrite (spis_cin[i].spis_films[j].name, sizeof (char)*strlen(spis_cin[i].spis_films[j].name), 1, in);  
			fwrite (&spis_cin[i].spis_films[j].year, sizeof(int), 1, in);  
			fwrite (spis_cin[i].spis_films[j].country, sizeof (char)*strlen(spis_cin[i].spis_films[j].country), 1, in);  
			fwrite (&spis_cin[i].spis_films[j].children, sizeof(bool), 1, in);  
			fwrite (spis_cin[i].spis_films[j].cinem, sizeof (char)*strlen(spis_cin[i].spis_films[j].cinem), 1, in);  
		}
	fclose(in);
	
}

void Dialog::Load()
{
	int w, n, p, p2, p3;
	Film X;
	FILE *in;    
	in = fopen ("spis_cin.dat", "rb");   
	fread (&n, sizeof(int), 1, in);
	for (int i=0; i<n; i++)
	{
		fread (&p, sizeof(int), 1, in);
		fread (&p2, sizeof(int), 1, in);
		fread (&p3, sizeof(int), 1, in);
		cout << p << " " <<p2 << " " <<p3 << "\n";
		X.name = new char[p];
		X.country = new char[p2];
		X.cinem = new char[p3];

		fread (X.name, sizeof(char)*p, 1, in);
		fread (&X.year, sizeof(int), 1, in);
		w = fread (X.country, sizeof(char)*p2, 1, in);
		w = fread (&X.children, sizeof(bool), 1, in);
		w = fread (X.cinem, sizeof(char)*p3, 1, in);
		X.vivod_film();
		spis_film.push_back(X);
	}
	fclose(in);
	
		system ("pause");
}
вот так сделал, теперь выводится полностью строка, но с хвостом: matrica<<<<<ое, хотя выделяю память только под строку, которую записывал: X.name = new char[p];

Последний раз редактировалось Stilet; 09.01.2016 в 14:04.
Uefa вне форума Ответить с цитированием
Старый 09.01.2016, 12:58   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

а терминантный 0?
p51x вне форума Ответить с цитированием
Старый 09.01.2016, 13:10   #8
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
а терминантный 0?
Точно! Все получилось, спасибо!
Uefa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при чтении файла Стремящийся Общие вопросы по Java, Java SE, Kotlin 4 03.07.2012 16:50
Ошибка при чтении из файла BEL9ILLI Общие вопросы C/C++ 3 13.01.2012 10:12
Ошибка при чтении из файла alex_alpha Общие вопросы C/C++ 5 08.08.2010 20:28
ошибка при чтении файла ongleb Общие вопросы C/C++ 17 30.07.2009 13:48
ошибка при чтении файла Alik-Soldier Общие вопросы C/C++ 1 31.05.2009 20:44