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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2011, 20:35   #1
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию Segmentation fault

Ошибка сегментации выскакивает в конце программы .

Запись в файл
Код:
size_of_programm=sizeof(programm);
    ofstream *file = new ofstream;
    file->open(name_of_prog,ios::out | ios::binary);
    file->write((char*) &programm , size_of_programm);
    file->close();
    delete file ;
Считывание из файла
Код:
//Определяем размер файла
    FILE *fin;
    fin = fopen("myprog", "rb");  
    long size;
    fseek(fin, 0, SEEK_END);
    size = ftell(fin);
    fseek(fin, 0, SEEK_SET);
    fclose(fin);

    //считываем файл
    HPL_Programm prog;
    ifstream in ("myprog",ios::in | ios::binary);
    in.read((char*)&prog , size);
    in.close();
Проверяю - нормально считывает и записывает в структуру prog , но в конце программы выводит ошибку . Чем может быть вызвано ?
Hemul вне форума Ответить с цитированием
Старый 15.08.2011, 22:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
in.read((char*)&prog , size);
никогда так не делайте.(чуть дальше обьяснил почему)

далее в сишном коде нет нужды.
размер можно узнать и через ifstream.

Код:
in.read((char*)&prog , sizeof(prog));
если уж читаете структуру, то читайте структуру, а не чтото наобум(достаточно файлы хоть на байт быть больше чем структура как плохо дело)

да и неплохо бы привести структуру, в ней надеюсь нет указателей?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.08.2011 в 22:05.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.08.2011, 22:26   #3
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Код:
struct HPL_Programm
{
    string name_of_programm; // имя программы

    variables_and_arrays var_and_arr ;//структура всех переменных и массивов
    map<string,HPL_user_struct> users_struct;//пользовательские структуры
    map<string,HPL_object_of_struct> objects_of_user_structs; // обьекты пользовательских структур
    vector<string> var_all_names; //все имена переменных, массивов, структур и функций

    map<string , HPL_function> functions;

    unsigned int count_of_if;
    unsigned int count_of_for;
    unsigned int count_of_while;

    unsigned int is_errors ; // количество ошибок в программе ,если 0 , то программу можно исполнять
};
вот структура
Hemul вне форума Ответить с цитированием
Старый 15.08.2011, 22:31   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

классы нельзя сохранять так.
тут или ручное сохранение или сериализация(например в бусте вроде есть такое)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.08.2011, 23:05   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

т.е. отдельно сохранять каждую часть структуры в текстовом режиме ?
Hemul вне форума Ответить с цитированием
Старый 16.08.2011, 01:31   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему же в текстовом?
пишите как хотите(всмысле теккст или бинарка)
главное прочтите потом обратно верно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2011, 02:03   #7
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

map, vector, string - это динамические контейнеры, в них содержатся указатели на данные. Что будет, если мы будем писать указатель в файл ? То в файл запишется адрес, а не данные !
Код:
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <string>
 std::ostream& operator << ( std::ostream& stream, const std::vector< std::string>& vecString)
{
	const size_t size_vec= vecString.size();
	// Пишем длину вектора
	stream.write( reinterpret_cast< const char*>( &size_vec), sizeof( size_t));
	  for ( size_t i =0; i < size_vec; i++)
	 {
		const char *s = vecString[i].c_str();
		const size_t size= vecString[i].size();
		// Пишем длину строки
		stream.write( reinterpret_cast< const char*>( &size), sizeof( size_t));
		// Пишем строку
		stream.write( s, size);
	 }
	return stream;
}
 std::istream& operator >> ( std::istream& stream, std::vector< std::string>& vecString)
{
	size_t size_vec;
	// Читаем длину вектора
	stream.read( reinterpret_cast< char*>( &size_vec), sizeof( size_t));
	  for ( size_t i =0; i < size_vec; i++)
	 {
		size_t size;
		// Читаем длину строки
		stream.read( reinterpret_cast< char*>( &size), sizeof( size_t));
		// Выделяем память для строки
		char *const s = new char[ size];
		// Читаем строку
		stream.read( s, size);
		vecString.push_back( std::string( s, size));
		delete[] s;
	 }
	return stream;
}
int main() {
   std::vector< std::string> vecStr1, vecStr2;
   vecStr1.push_back( "Test_string");
   vecStr1.push_back( "string2");
   // Пишем в файл
   std::fstream out_file;
   out_file.open( "file", std::ios_base::out | std::ios_base::binary);
   out_file << vecStr1;
   out_file.close();
   // Читаем из файла
   std::fstream in_file;
   in_file.open( "file", std::ios_base::in | std::ios_base::binary);
   in_file >> vecStr2;
   in_file.close();
   // Выводим в консоль
   std::copy( vecStr2.begin(), vecStr2.end(), std::ostream_iterator< std::string>( std::cout, " "));
   system( "pause");
   return 0;
}
Вот как можно записать в файл в бинарном формате и прочитать контейнер типа std::vector< std::string>. Для остальных типов так же.
An1ka вне форума Ответить с цитированием
Старый 16.08.2011, 03:23   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

An1ka, все хорошо кроме одного, незабывайте что оператор <</>> это форматированный ввод/вывод
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
qsort - Segmentation fault и другие непонятки FILLIPO Общие вопросы C/C++ 6 05.09.2010 10:57
Vector, Pair и segmentation fault certman Общие вопросы C/C++ 3 25.03.2010 00:24
QT4 segmentation fault jojahti Qt и кроссплатформенное программирование С/С++ 6 06.01.2010 09:57
GCL и segmentation fault. jojahti Свободное общение 0 14.09.2009 19:20
Program received signal SIGSEGV, Segmentation fault. ciaonataha Общие вопросы C/C++ 53 24.04.2009 14:06