"Dynamiczna" struktura


(Ovitz Pl) #1

Witam pięknie, mój problem wyglada tak;

Chce napisać program ktory będzie wczytywał dane z pliku do struktury i je tam trzymał aby potem je odczytać, pozmieniać itp...

Prosty rogram wyglada tak

struct termin

{

	unsigned int rokp;			

	unsigned int rokk;			

	unsigned int dzienp;			

	unsigned int dzienk;			

	float godzp;		

	float godzk;		

	char temat[25];		

	char opis[250];		

};


void odczyt()	{ //Fukncja do odczytu danych z pliku


termin t;

fstream plik;

	plik.open("terminy.txt", ios::in);


		for (;;) {

		plik>>t.rokp; 

		plik>>t.rokk; 

		plik>>t.dzienp;

		plik>>t.dzienk;

		plik>>t.godzp;

		plik>>t.godzk;

		plik.getline(t.temat, 25, '|');

		plik.getline(t.opis, 250, '\n');


		plik.close ();


		if(!plik) break;


		};


};

No i właśnie nie wiem jak zrobić aby dynamicznie rezerwować pamieć w tej stukturze.

Mam nadzieje że zrozumiale opisałem mój problem.


([alex]) #2

Dynamicznie rezerwować pamięć w tej strukturze, oznacza przydzielać dokładnie tyle ile potrzebujesz.

struct termin

{

   unsigned int rokp;         

   unsigned int rokk;         

   unsigned int dzienp;         

   unsigned int dzienk;         

   float godzp;      

   float godzk;      

   char *temat;

   char *opis;      

};

wczytywanie:

...

      plik>>t.godzk;

      char bufor[250];

      plik.getline(bufor, 25, '|');

      t.temat=strdup(bufor);

      plik.getline(bufor, 250, '\n');

      t.opis=strdup(bufor);

      ...

kiedy dane struktury już nie będą potrzebne, koniecznie zwolnić pamięć:

delete[] t.temat;

delete[] t.opis;

Nie rozumiem tylko jednego w twoim wczytywaniu, jaki sens wczytywać coś w pętli nie robiąc po drodze nić z tymi danymi. Może chodziło o dynamiczną rezerwacje pamięci na całą tablice struktur?


(Ovitz Pl) #3

Jednak chyba źle opisałem o co mi chodzi, wybacz.

Rozbudowałem mój programik:

int a=5;

termin *t = new termin[a];

fstream plik;

	plik.open("terminy.txt", ios::in);


	};




		for (int i=0;;i++) {

		plik>>t[i].rokp; 

		plik>>t[i].rokk; 

		plik>>t[i].dzienp;

		plik>>t[i].dzienk;

		plik>>t[i].godzp;

		plik>>t[i].godzk;

		plik.getline(t[i].temat, 25, '|');

		plik.getline(t[i].opis, 250, '|');	

		cout<<"p: "<
		if(!plik) break;


		};

	plik.close ();

};

W nim definiuje że strukture 5 elementowa, ale ja chce aby struktura miały tyle elementów ile np. jest linijek w pliku. I szukam na to jakiegoś optymalnego rozwiązania. W tym wypadku chyba starczy policzyc linijki pliku najpierw a potem utworzyć nowa stukture n-elementową. Tylko czy:

  1. Jest to dobre rozwiązanie?

  2. Jak policzyć linijki pliku, omijając dane jakie się w tej linijce znajdują?

Przykładowy plik:

I przy okazji, ten programik co zamieściłem wyżej wczytuje mi o jedna linijke pliku za dużo, jak go poprawić?

Ps. "t.opis=strdup(bufor);" - co to robi? :stuck_out_tongue:


([alex]) #4

O wiele mniej kosztownym rozwiązaniem (czasowo) jest przydzielać dynamicznie pamięć coś kopiować i zwalniać niż dwa razy czytać plik.

Coś kolo 35 min mi to zajęło :o , to straszne! , ale znalazłem przy okazji błąd w DevCpp :smiley:

#include