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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2013, 16:58   #1
raz24
 
Регистрация: 24.12.2012
Сообщений: 3
Вопрос Ошибка сегментирования при чтении файла

Доброго дня!
Компилирую программу в Linux'е: g++ main.cpp. Программа компилируется и запускается без ошибок. Но во время вызова функции чтения данных из файла, а именно при выборе пункта меню моей программы "Прочитать данные из файла" возникает ошибка - "Ошибка сегментирования".

Код функций чтения данных из файла:
Код:
//метод получения числа объектов в файле
unsigned int uifCountDataBaseObjects()
{
	ifstream ifsDataBase;
	ifsDataBase.open("out.txt", ios::binary);
	ifsDataBase.seekg(0, ios::end);
	return (int) ifsDataBase.tellg() / sizeof(clsAuto);
}
//метод чтения данных из файла
clsAuto& clsAuto::fnReadDataBase(unsigned int uiObjectNum)
{
	ifstream ifsDataBase;
	ifsDataBase.open("out.txt", ios::binary);
           ifsDataBase.seekg( uiObjectNum*sizeof(clsAuto) );
	ifsDataBase.read( (char*)this, sizeof(*this) );
	return (*this);
}
Case в функции main:
Код:
case '1': 
			for(unsigned int i=0; i<uifCountDataBaseObjects(); i++)
			{
				newAuto.fnReadDataBase(i);
				lstAutoList.push_back(newAuto);
			}
			uiObjectsInList=lstAutoList.size();
			cout<<uiObjectsInList;
			break;
GDB показывает:
Цитата:
Program received signal SIGSEGV, Segmentation fault.
0xb7f91ebc in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) ()
from /usr/lib/i386-linux-gnu/libstdc++.so.6
Вероятнее всего ошибка кроется в этой строке "ifsDataBase.read( (char*)this, sizeof(*this) );", но как её заставить работать пока не знаю. Объясните, пожалуйста, новичку.

Последний раз редактировалось raz24; 27.12.2013 в 17:00.
raz24 вне форума Ответить с цитированием
Старый 27.12.2013, 17:25   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

У вас, судя по всему, в объекте есть переменные типа std::string - они выделяют память динамически и при каждом запуске программы она будет разная, а при чтении из файла вы получаете указатель, выделенный в прошлый прогон программы.
Чтоб заработало, либо делайте char var[123] вместо std:string var; либо не делайте read(this, sizeof(this)).
waleri вне форума Ответить с цитированием
Старый 27.12.2013, 19:13   #3
raz24
 
Регистрация: 24.12.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
У вас, судя по всему, в объекте есть переменные типа std::string - они выделяют память динамически и при каждом запуске программы она будет разная, а при чтении из файла вы получаете указатель, выделенный в прошлый прогон программы.
Чтоб заработало, либо делайте char var[123] вместо std:string var; либо не делайте read(this, sizeof(this)).
Да, обьекты типа string. А не меняя типа данных на char никак не добиться работы функции?
raz24 вне форума Ответить с цитированием
Старый 27.12.2013, 22:06   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

В таком виде - нет, да и это худший из возможных способов.
Что будет если завтра вам надо будет добавить новые данные...
waleri вне форума Ответить с цитированием
Старый 28.12.2013, 22:26   #5
raz24
 
Регистрация: 24.12.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
В таком виде - нет, да и это худший из возможных способов.
Что будет если завтра вам надо будет добавить новые данные...
А каким способом можно заставить работать функцию не меняя тип данных? Мысли иссякли, да и перелопачивать всю программу не очень хочется. Направьте на истинный путь.
raz24 вне форума Ответить с цитированием
Старый 28.12.2013, 22:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я думаю что сериализацию придется писать. ИМХО нет стандартных путей решения таких проблем. Т.е. написать метод или функу, которая переводит все поля объекта\структуры в некий поток байт с маркерами границ данных полей. А при считывании считав маркер можно понять сколько байт считывать для конкретного поля.
Ключевые слова "Сериализация", "Маршалинг".
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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
ошибка при чтении файла Alik-Soldier Общие вопросы C/C++ 1 31.05.2009 20:44
Ошибка при чтении БД из файла!! sting БД в Delphi 4 14.12.2008 22:23