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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2011, 20:20   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Чтение из файла классом ifstream

Решил освоить файловые операции С++, до этого пользовался сишными методами. Возникла проблема - не считываются переменные типа string:


Код:
 
#include <iostream>
#include <fstream>

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

using namespace std;

class one{
public:
	string name;
	int num;

	one(string n = "something", int n2 = 0): name(n), num(n2){}
};

int main(int argc, char *argv[]){
	
	if(SDL_Init(SDL_INIT_VIDEO) != 0)
		cout << "Error initializing SDL: " << SDL_GetError() << endl;
	else
		cout << "SDL inititalized succesfully." << endl;

	
	one two;
	one o("certain", 1);

	ofstream output_file("data");
	if (output_file.fail()){
		cerr << "Error opening file 1" << endl;
		exit(1);
	}
	else{
		output_file.write((char *) &two, sizeof(one));
	}
	output_file.close(); 

	
	ifstream input_file("data");
	if (input_file.fail()){
		cerr << "Error opening file 2" << endl;
		exit(1);
	}
	else{
		input_file.read((char *) &two, sizeof(one));
	}
	input_file.close(); 

	cout << "two: " << two.name << " " << two.num << endl;

	return 0;
}
В коде, что я сейчас привёл, всё работает. Но если я удалю кусок кода, где в файл записывается объект о, при условии, что файл уже существует, и из него можно что-то считать... Всё вроде работает. Но если я удалю инициализацию o, то в two считается переменная num, а name останется той же, что и при создании этого объекта (т.е. "something"), или вообще при выводе произойдёт ошибка сегментирования.

Где я напортачил?

Последний раз редактировалось Кипящий чайник; 05.03.2011 в 08:08.
Кипящий чайник вне форума Ответить с цитированием
Старый 04.03.2011, 21:51   #2
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

то что вы делаете называется сериализацией, естественно делается она не так, ибо в жизни все сложнее
во-первых когда вы делаете input_file.read((char *) &two, sizeof(one)); вы возлагаете большие надежды на то что все будет как вы ожидаете. Реально запись содержимого класса сильно зависит от того как компилятор его представляет его в памяти

запись и последующее прочтения std::string вообщето сомнительно, это связано с тем, что контейнер хранит в себе не только поля, но и указатель на кучу в которой выделены данные (в отсутствии инициализации он будет черт знает куда указывать), аллокатор, который он использует итд
так вот когда вы запишете объект максимум что скопирую указатели, ни внешние зависимости, ни в вашем случае состояние объекта (в смысле поведения) передано не будет

input_file.fail() - есть bool operator!()
input_file.close(); - у fstream есть деструктор, который сам закроет файл

Последний раз редактировалось Stilet; 05.03.2011 в 08:56.
alex_x_x вне форума Ответить с цитированием
Старый 04.03.2011, 22:50   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Меня интересует не это, а как записать в файл переменную типа string
Кипящий чайник вне форума Ответить с цитированием
Старый 04.03.2011, 22:56   #4
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

Код:
string a;
a="abc";
ofstream out("text.txt");
out<<a;
out.close();
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 05.03.2011, 00:03   #5
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Респект за SDL.

Но тут такое дело, логичней сделать operator<< для твего класса и ofstream. Смотри пример здесь: http://www.learncpp.com/cpp-tutorial...-io-operators/
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 05.03.2011, 08:05   #6
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Спасибо. SDL штука сишная, на линуксе я программирую с ней на Си. А вот MS Visual C++ 6.0 почему-то жутко глючит, компилируя сишный код. Решил использовать функции и классы С++
Кипящий чайник вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла С++ Michahodrev Помощь студентам 2 18.12.2010 23:47
С++ Чтение из файла sir.andrey Помощь студентам 9 15.10.2010 16:00
Чтение из файла(ifstream) C++ Alex1991 Помощь студентам 2 22.03.2010 20:23
Чтение из файла utrnjhyfgjktjy Помощь студентам 9 30.01.2010 17:41
чтение из файла. aschak Общие вопросы C/C++ 9 30.12.2008 15:24