ios::write()

0

Witam mam taki problem, otoz zapisuje sobie liste swoich obiektow i odczytuje ja dzieki takim metodom:

void Gazomierz::WriteToFile(fstream& plik)
{
	plik.write(typ, 25*sizeof(char));
	plik.write(rokprod, 5*sizeof(char));
	plik.write(rokleg, 5*sizeof(char));
	plik.write(numer, 7*sizeof(char));
	plik.write(stan, 11*sizeof(char));
	plik.write(status, 11*sizeof(char));
}

void Gazomierz::ReadFromFile(fstream& plik)
{
	plik.read(typ, 25*sizeof(char));
	plik.read(rokprod, 5*sizeof(char));
	plik.read(rokleg, 5*sizeof(char));
	plik.read(numer, 7*sizeof(char));
	plik.read(stan, 11*sizeof(char));
	plik.read(status, 11*sizeof(char));
}

ktore sa wywolywane tak:

void Database::GWriteToFile()
{
	list<Gazomierz*>::iterator temp;
	char nazwapliku[100];
	fstream plik;

	cout<<"Prosze podac nazwe pliku do zapisu: ";
	cin>>nazwapliku;

	plik.open(nazwapliku, ios::out|ios::binary);
	
	if(plik.bad())
	{
		cout<<"\n\n\nBlad podczas tworzenia pliku do zapisu!\n\n\n";
		Pauza();
		plik.clear();
		return;
	}
	else
	{
		for(temp = Magazyn.begin(); temp != Magazyn.end(); temp++)
		{
			(*temp)->WriteToFile(plik);
		}
	}
}

void Database::GReadFromFile()
{	
	Gazomierz *gazo;
	char nazwapliku[100];
	fstream plik;

	cout<<"Prosze podac nazwe pliku do odczytu: ";
	cin>>nazwapliku;

	plik.open(nazwapliku, ios::in|ios::binary);
	
	if(plik.bad())
	{
		cout<<"Blad podczas odczytywania!\n";
		Pauza();
		plik.clear();
		return;
	}
	else
	{
		while(!plik.eof())
		{
			gazo = new Gazomierz;
			if(!gazo)
			{
				cout<<"\n\nBlad podczas alokacji pamieci!\n";
				Pauza();
				return;
			}
			gazo->ReadFromFile(plik);
			AddGazomierz(gazo);
		}
		plik.close();
	}

}

Wie ktos moze, dlaczego po wczytaniu 3ego gazomierza, ktory jest ostatnim, jaki zapisywalem do pliku petla wykonuje sie jeszcze raz???

Plik z danymi wyglada tak:

Bailand ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ1999 0 ÍÍÍ123456 0 ÍÍÍÍÍÍÍÍÍbrak ÍÍÍÍÍÍBailand ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ1999 1999 111234 0 ÍÍÍÍÍÍÍÍÍ0 ÍÍÍÍÍÍÍÍÍBailand ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ1999 0 ÍÍÍ123112 0 ÍÍÍÍÍÍÍÍÍbrak ÍÍÍÍÍÍ

Mysle, ze po odczytaniu "brak\0" nie ustawia sie na koncu, tylko zaraz za nim... i wczytuje dalej te slaczki.... dlatego potem przy wypisywaniu listy mam 4 gazomierze, ze czego jeden jest pelen czegos takiego: r&&R&%&^%

prosze o pomoc.
Pozdrawiam.

0

[15.5] Why does my input seem to process past the end of file?
http://www.parashift.com/c++-faq-lite/input-output.html

bo eof() to nie jest jak w Pascalu, po odczytaniu zostanie dopiero ustawiony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1