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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2011, 13:25   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию чтение из бинарного файла

как это сделать для такой структуры грамотно?
struct person
{
std::string name;
std::string surname;
std::string patronymic;
__int64 number;
std::string address;
};
а то недавно тут кого-то раскритиковали за кривоту рук.
Kukurudza вне форума Ответить с цитированием
Старый 08.09.2011, 16:13   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Все поля поля по-отдельности записать надо.
Через fstream.write.
TwiX вне форума Ответить с цитированием
Старый 08.09.2011, 18:07   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Если в файле строки name, surname, patronymic и address оканчиваются \n, то можно так:
Код:
istream& operator >> (istream &stream, person &pers)
{
   getline(stream, pers.name);
   getline(stream, pers.surname);
   getline(stream, pers.patronymic);
   stream.read((char*)&pers.number, sizeof pers.number);  
   getline(stream, pers.address);
   return stream; 
}

// ...

ifstream fin("file.bin", ios::in | ios::binary);
person pers;
fin >> pers;
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 08.09.2011, 18:58   #4
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

спасибо. попробовал.
еще сделал так:
Код:
int CProjectDlg::SaveDataBase ( void )
{
	std::ofstream of("DataBase", std::ios::binary);// связь с файлом	
	if (!of)
	{    // файл несуществует
		of.close();	
		return 0;
	};
	size_t sizeDB = DB.size();
	for ( size_t i = 0; i < sizeDB; ++i )
	{
		of.write(reinterpret_cast<char*>(&DB[i].name), sizeof(std::string));				//	чтение имени
		of.write(reinterpret_cast<char*>(&DB[i].surname), sizeof(std::string));				//	чтение фамилии
		of.write(reinterpret_cast<char*>(&DB[i].patronymic), sizeof(std::string));			//	чтение отчества
		of.write(reinterpret_cast<char*>(&DB[i].address), sizeof(std::string));				//	чтение адреса	
		of.write(reinterpret_cast<char*>(&DB[i].number), sizeof(__int64));					//	чтение номера	
	};
	of.close();
	return 1;
};

int CProjectDlg::LoadDataBase ( void )
{
	std::ifstream in("DataBase", std::ios::binary);// связь с файлом	
	if (!in)
	{    // файл несуществует
		in.close();	
		return 0;
	};
	size_t sizeDB = DB.size();
	person tmp_person;

	in.read(reinterpret_cast<char*>(&tmp_person.name), sizeof(std::string));					//	чтение имени
	in.read(reinterpret_cast<char*>(&tmp_person.surname), sizeof(std::string));					//	чтение фамилии
	in.read(reinterpret_cast<char*>(&tmp_person.patronymic), sizeof(std::string));				//	чтение отчества
	in.read(reinterpret_cast<char*>(&tmp_person.address), sizeof(std::string));					//	чтение адреса
	in.read(reinterpret_cast<char*>(&tmp_person.number), sizeof(__int64));						//	чтение номера

	for ( size_t i = 0; in; ++i )
	{
		DB.push_back(tmp_person);
		in.read(reinterpret_cast<char*>(&tmp_person.name), sizeof(std::string));				//	чтение имени
		in.read(reinterpret_cast<char*>(&tmp_person.surname), sizeof(std::string));				//	чтение фамилии
		in.read(reinterpret_cast<char*>(&tmp_person.patronymic), sizeof(std::string));			//	чтение отчества
		in.read(reinterpret_cast<char*>(&tmp_person.address), sizeof(std::string));				//	чтение адреса	
		in.read(reinterpret_cast<char*>(&tmp_person.number), sizeof(__int64));					//	чтение номера	
	};
	in.close();
	return 1;
};
теперь вопрос. что лучше?? getline или преобразование типа как у меня? и что вообще значит char вот в этоих строчках:
reinterpret_cast<char*>(&tmp_person .address), sizeof(std::string)??
и еще вопрос. sizeof в данном случае выдаст 4 байта как размер указателя? и вообще что значит то что я написал?
Kukurudza вне форума Ответить с цитированием
Старый 08.09.2011, 18:58   #5
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

спасибо. попробовал.
еще сделал так:
Код:
int CProjectDlg::SaveDataBase ( void )
{
	std::ofstream of("DataBase", std::ios::binary);// связь с файлом	
	if (!of)
	{    // файл несуществует
		of.close();	
		return 0;
	};
	size_t sizeDB = DB.size();
	for ( size_t i = 0; i < sizeDB; ++i )
	{
		of.write(reinterpret_cast<char*>(&DB[i].name), sizeof(std::string));				//	чтение имени
		of.write(reinterpret_cast<char*>(&DB[i].surname), sizeof(std::string));				//	чтение фамилии
		of.write(reinterpret_cast<char*>(&DB[i].patronymic), sizeof(std::string));			//	чтение отчества
		of.write(reinterpret_cast<char*>(&DB[i].address), sizeof(std::string));				//	чтение адреса	
		of.write(reinterpret_cast<char*>(&DB[i].number), sizeof(__int64));					//	чтение номера	
	};
	of.close();
	return 1;
};

int CProjectDlg::LoadDataBase ( void )
{
	std::ifstream in("DataBase", std::ios::binary);// связь с файлом	
	if (!in)
	{    // файл несуществует
		in.close();	
		return 0;
	};
	size_t sizeDB = DB.size();
	person tmp_person;

	in.read(reinterpret_cast<char*>(&tmp_person.name), sizeof(std::string));					//	чтение имени
	in.read(reinterpret_cast<char*>(&tmp_person.surname), sizeof(std::string));					//	чтение фамилии
	in.read(reinterpret_cast<char*>(&tmp_person.patronymic), sizeof(std::string));				//	чтение отчества
	in.read(reinterpret_cast<char*>(&tmp_person.address), sizeof(std::string));					//	чтение адреса
	in.read(reinterpret_cast<char*>(&tmp_person.number), sizeof(__int64));						//	чтение номера

	for ( size_t i = 0; in; ++i )
	{
		DB.push_back(tmp_person);
		in.read(reinterpret_cast<char*>(&tmp_person.name), sizeof(std::string));				//	чтение имени
		in.read(reinterpret_cast<char*>(&tmp_person.surname), sizeof(std::string));				//	чтение фамилии
		in.read(reinterpret_cast<char*>(&tmp_person.patronymic), sizeof(std::string));			//	чтение отчества
		in.read(reinterpret_cast<char*>(&tmp_person.address), sizeof(std::string));				//	чтение адреса	
		in.read(reinterpret_cast<char*>(&tmp_person.number), sizeof(__int64));					//	чтение номера	
	};
	in.close();
	return 1;
};
теперь вопрос. что лучше?? getline или преобразование типа как у меня? и что вообще значит char вот в этоих строчках:
reinterpret_cast<char*>(&tmp_person .address), sizeof(std::string)??
и еще вопрос. sizeof в данном случае выдаст 4 байта как размер указателя? и вообще что значит то что я написал?
Kukurudza вне форума Ответить с цитированием
Старый 08.09.2011, 19:03   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Лучше мое, потому что ваше не работает. string - динамический контейнер, следовательно записывать его побитовую копию нельзя, т.к. в итоге вы запишите указатели на данные (на строку), а не данные.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 08.09.2011, 19:09   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Сообщение от Kukurudza
и что вообще значит char вот в этоих строчках
Цитата:
Сообщение от Kukurudza
преобразование типа
Цитата:
Сообщение от cplusplus.com
istream& read ( char* s, streamsize n );
http://www.cplusplus.com/reference/i.../istream/read/
Цитата:
и еще вопрос. sizeof в данном случае выдаст 4 байта как размер указателя?
Если указатель занимает 4 байта.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение данных из бинарного файла Faramir02 Общие вопросы C/C++ 3 22.12.2010 22:43
запись/чтение из бинарного файла. H1ghlander Общие вопросы C/C++ 0 21.11.2010 17:44
Чтение типизированого бинарного файла (ILDA) Ryazanec Общие вопросы Delphi 6 24.10.2010 21:16
Чтение из бинарного файла. kir_rik Помощь студентам 2 04.06.2010 00:31
Запись/чтение из бинарного файла - непонятные проблемы.... Jorgen Общие вопросы C/C++ 1 26.11.2009 11:45