Niepotrzebna funkcja rozmiar?

0

Witam! Na wstępie chciałbym wszystkim życzyć Wesołych świąt!
Wracając do tematu. W znalezionym w internecie programie (baza danych w c++) natknąłem się na funkcję:

 int rozmiar(char *in)
{
	string model , marka;
	int rok , numer;
	double cena;
	
	ifstream plik;
	plik.open(in);
	int rozm = 0;
	
	while(!plik.eof())
	{
		plik>>numer;
		plik>>marka;
		plik>>model;
		plik>>rok;
		plik>>cena;
		
		rozm += 1;
	}
	
	plik.close();
	return rozm;
}

O ile dobrze widzę ma ona za zadanie obliczyć ilość struktur w bazie?

Jej zastosowanie:

 case 2:
		{
		
			int ile;
			cout<<"Ile samochodow chcesz dopisac do bazy ?\n";
			cin>>ile;	
					
			int roz = rozmiar(argv[1])+ile-1;
			int rozm = rozmiar(argv[1])-1;
			
					
			Samochod *s = new Samochod [roz];
			zpliku(argv[1],s,rozm);
			
			for(int i=rozm;i<roz;++i)
			{
				s[i].numer = i+1;
				cout<<"Podaj marke :\n";
				cin>>s[i].marka;
				cout<<"Podaj model :\n";
				cin>>s[i].model;
				cout<<"Podaj rok produkcji :\n";
				cin>>s[i].rok;
				cout<<"Podaj cene :\n";
				cin>>s[i].cena;
			}
		
			ofstream plik;
			plik.open(argv[1]);
			for(int i=0;i<roz;++i)
			{
				plik<<s[i].numer<<endl;
				plik<<s[i].marka<<endl;
				plik<<s[i].model<<endl;
				plik<<s[i].rok<<endl;
				plik<<s[i].cena<<endl;
				plik<<"\n\n";
			}
			plik.close();
			delete [] s;
			break;
		}

Czy można pozbyć się tej funkcji i jakoś inaczej rozwiązać ten problem? Jak widać w case baza jest ponownie odczytywana, chce się tego pozbyć w celu optymalizacji programu. Jakieś pomysły? Jeśli nie istnieje taka możliwość to proszę o wytłumaczenie dlaczego w funkcji ponownie zdefiniowano poszczegolne typy i jak to działa.

0

Po pierwsze, rozmiar wołane jest raz, a potem drugi raz w kolejnej linijce, co już jest idiotyczne. Po drugie, nie musisz znać rozmiaru, tablicę wystarczy zastąpić jakimś vectorem, czy co tam jest w cpp i dokładać do niego, aż plik się skończy. Po trzecie, rozmiar można zapisać na początku pliku, jeśli do czegoś ma się przydać.

0

Pozbyłem się drugiego wywołania funkcji rozmiar i wygląda to tak:

int rozm = rozmiar(argv[1])-1;
int roz = rozm +ile ;

Resztę zostawię chyba tak jak jest :) Bo nie chcę się zbytnio zagłębiać w vectory.

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