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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2010, 23:16   #1
Anuta606
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию Чтение структуры данных из файла

Проблемы с чтением струтуры данных из файла.Помогите

Код:
#include<cstdlib>
#icnlude<iostream>
#include<fstream>
#include <iomanip>
using namespace std;
inline void eatline() { while (cin.get() != '\n') continue; }
const char * file ="Shoping.dat";
struct Shop
{
	char *Name;
	char *Marka;
	float Price;
};
Shop *Zapovnennia(int a)
{   
	Shop *Ima1=new Shop[a];
	for(int i=0;i<a;i++)
	{   int q=0;
		q=rand()%100;
		if((q)>60)         {Ima1[i].Name="Televizor";}
		if(q<=60 && q>=30) {Ima1[i].Name="Magnitola";}
		if(q<30 && q>=0)   {Ima1[i].Name="DVD      ";}
		q=rand()%100;
		if((q)>75)         {Ima1[i].Marka="SONY   ";}
		if(q<=75 && q>=50) {Ima1[i].Marka="PHILIPS";}
		if(q<50 && q>25)   {Ima1[i].Marka="SAMSUNG";}
		if(q<=25 && q>=0)  {Ima1[i].Marka="SHARP  ";}
		q=rand()%100;
		Ima1[i].Price=q*100.2f;
	}
	return Ima1;
}
void Vuvid(Shop *Ima,int b)
{
for(int i=0;i<b;i++)
	{
		cout<<i+1<<"  "<<Ima[i].Name<<"\t"<<Ima[i].Marka<<"\t\t"<<Ima[i].Price<<"\n";
	}
}
int main()
{
	
	int a=20,b=20,c=-1,x=0,y=0;
	srand(time(NULL)); Shop *Ima2=new Shop[a];
	//ofstream fout(file, ios::out | ios::app | ios::binary);
//записываю данные у файл через функцию, а при повторном запуску нужно что бы структуру просто считало с файла
	//Shop *Ima=Zapovnennia(b);
	//for(int i=0;i<b;i++)
	//	fout.write((char*) &Ima[i], sizeof Ima[i]);
	Shop *Ima=new Shop[b];
	ifstream fin;
	fin.open(file, ios::out | ios::app | ios::binary);
	for(int i=0;i<b;i++)
	fin.read((char *)&Ima[i], sizeof Ima[i]);
	Vuvid(Ima,b);
}

Последний раз редактировалось Stilet; 05.11.2010 в 13:23.
Anuta606 вне форума Ответить с цитированием
Старый 04.11.2010, 01:50   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Т.к в структуре используются строки char *, то перед использованием структуры под них набо выделять память. Например, можно написать функцию, инициализирующую структуру
Код:
Shop init(){
	Shop sp;
	sp.Name=new char[256];
	sp.Marka= new char[256];
	return sp;
}
Далее в программе, когда надо работать со структурой инициализируем ее
Код:
Shop Mag=init();
Вот небольшой пример записи этой структуры в файл считывания из него:


Код:
int main(){
	
	Shop Mag=init();

             cin>>Mag.Name;
	
	cin>>Mag.Marka;

	cin>>Mag.Price;
	
	ofstream out("struct.bar", ios::out|ios::app|ios::binary);
	
	int size=sizeof(float)+strlen(Mag.Name)+strlen(Mag.Marka);
	
	out.write((char *)&Mag,size);
	
	out.close();
	
	char *buf=new char [size];
	
	ifstream in("struct.bar", ios::in|ios::binary);
	
	in.read(buf,size);
	
	Shop New=init();
	New=*((Shop *)buf);

	cout<<New.Name<<" " << New.Marka<<" " <<New.Price<<endl;
	
	delete buf[];
	
	return 0;
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 04.11.2010, 10:47   #3
Anuta606
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

чесно говоря не совсем понытно как должен считыватся массив структур

Код:
ofstream fout(file, ios::out | ios::app | ios::binary);
	Shop *Ima=Zapovnennia(b);
	for(int i=0;i<b;i++)
	fout.write((char*) &Ima[i], sizeof (float)+strlen(Ima[i].Name)+strlen(Ima[i].Marka) );
	
	ifstream fin(file, ios::out | ios::app | ios::binary);
	Shop *Ima=new Shop[b];
	for(int i=0;i<b;i++)
	fin.read((char *)&Ima[i],( sizeof (float)+strlen(Ima[i].Name)+strlen(Ima[i].Marka)));
	Vuvid(Ima,b);
я так исправила, но все равно нет результата

Последний раз редактировалось Stilet; 05.11.2010 в 13:23.
Anuta606 вне форума Ответить с цитированием
Старый 04.11.2010, 13:41   #4
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Во первых, файл, в который мы записали надо закрывать
Код:
fout.close()
Во торых, когда считываем вторую и последущие структуры из файла надо указывать позицию в файле откуда начинается считывание
Код:
fin.seekg(pos);
Третье
Цитата:
fin.read((char *)&Ima[i],( sizeof (float)+strlen(Ima[i].Name)+strlen(Ima[i].Marka)));
тут явно из файла будет считан кусок структуры, но не вся она, т.к Ima[i] не инициализирован.
Вот записьв файл:
Код:
             int n=3;
	
	Shop *Mag= new Shop[n];
	
	Mag=Zapovnennia(n);
	
	int size[n]; //============размеры структур
	
	ofstream out("struct.bar", ios::out|ios::app|ios::binary);
	
	for(int i=0;i<n;i++){
	
	
	     size[i]=sizeof(float)+strlen(Mag[i].Name)+strlen(Mag[i].Marka);
	
	     out.write((char *)&Mag[i] ,size[i]);
	
	}
	
	out.close();
А Вот считывание из файла:
Код:

	int SIZE=0;//==============позиция в файле откуда начинается считывание структуры
	
	Shop *New=new Shop[n];
	
	for(int i=0;i<n;i++){
		
	   New[i]=init();
	
	   char *buf=new char [size[i]];
	
	   ifstream in("struct.bar", ios::in|ios::binary);
	
	   in.seekg(SIZE);
	
	   in.read(buf,size[i]);
	
	   SIZE+=size[i];
 
	   New[i]= *((Shop *)buf);
	   delete[] buf;
}
	Vuvid(New,n);
	delete[] Mag;
	delete[] New;
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 04.11.2010, 18:43   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

#icnlude<iostream> Первое что бросилось в глаза
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 04.11.2010, 18:53   #6
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Да, косяки там периодически встречались Я думаю, что автор программы в состоянии сама их исправить. Если не получится, обращайся, выложу полный код.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 04.11.2010, 23:24   #7
Anuta606
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

вставила то, что вы написали, но все равно не идет(( дайте пожалуйста полный текст программы

напишите пожалуйста полный код, потому что пробовала и ничего не получается((((

выложите пожалуйста полный текст, не получается(((

Последний раз редактировалось Stilet; 05.11.2010 в 13:24.
Anuta606 вне форума Ответить с цитированием
Старый 05.11.2010, 11:49   #8
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Код:
#include <iostream>
#include <stdlib.h>
#include <fstream>


//==================Structure===============
struct Shop{
   char *Name;
   char *Marka;
   float Price;   
};

//=================Structure initialization===========
Shop init(){
	Shop sp;
	sp.Name=new char[256];
	sp.Marka= new char[256];
	return sp;
}
//======================================
Shop *Zapovnennia(int a)
{ 

Shop *Ima1=new Shop[a];
int q=0;

for(int i=0;i<a;i++){
q=rand()%60;

if((q)>60) Ima1[i].Name="Televizor";
if(q<=60 && q>=30) Ima1[i].Name="Magnitola";
if(q<30 && q>=0) Ima1[i].Name="DVD ";

q=rand()%100;


if((q)>75) Ima1[i].Marka="SONY ";
if(q<=75 && q>=50) Ima1[i].Marka="PHILIPS";
if(q<50 && q>25) Ima1[i].Marka="SAMSUNG";
if(q<=25 && q>=0) Ima1[i].Marka="SHARP ";

q=rand()%100;

Ima1[i].Price=q*100.2f;


}
return Ima1;
}

void Vuvid(Shop *Ima,int b)
{
for(int i=0;i<b;i++) cout<<i+1<<" "<<Ima[i].Name<<"\t"<<Ima[i].Marka<<"\t\t"<<Ima[i].Price<<"\n";

}

//=======================================

int main(){
	
	int n=5;
	
	Shop *Mag= new Shop[n];
	
	Mag=Zapovnennia(n);
	
	int size[n];
	
	char *file_name=new char [25];//=====имя файла, в который сохраняем
	
	cin>>file_name;
	
             //=========запись в файл===========

	ofstream out(file_name, ios::out|ios::app|ios::binary);
	
	for(int i=0;i<n;i++){
	
	
	    size[i]=sizeof(float)+strlen(Mag[i].Name)+strlen(Mag[i].Marka);
	
	    out.write((char *)&Mag[i] ,size[i]);
	
	}
	
	out.close();

	int SIZE=0;
	
	Shop *New=new Shop[n];

             //=======считывание из файла==========
	
	ifstream in(file_name, ios::in|ios::binary);
	
	for(int i=0;i<n;i++){
		
	      New[i]=init();
	
	      char *buf=new char [size[i]];
	
	      in.seekg(SIZE);
	
	      in.read(buf,size[i]);
	
	      SIZE+=size[i];
 
	      New[i]= *((Shop *)buf);
	      delete[] buf;
             }
	Vuvid(New,n);
	
	delete[] Mag;
	delete[] New;
	delete[] file_name;
	
	
	return 0;
	
}
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 05.11.2010, 18:26   #9
Anuta606
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

большое большое спасибо!!!!!
Anuta606 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение структуры из файла atenon Общие вопросы C/C++ 11 22.10.2010 20:35
сохранение/чтение структуры с файла Vorname Общие вопросы C/C++ 4 10.11.2009 17:59
Запись структуры и чтение из файла [MI_nor] Общие вопросы C/C++ 6 08.04.2009 15:52
Чтение данных из файла в С++ Zaya007 Помощь студентам 9 17.03.2009 21:00
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30