Dynamiczna tablica struktur

0

Cześć, nowe zadanie od wykładowcy nad którym siedze pare dni :x Program wczytuje z pliku dane i zapisuje je w nowym pliku sformatowane. Mam zrobione tylko się przyczepił, że podejrzałem ilość wierszy w pliku tekstowym i na sztywno tablice ustawiłem :v Robiłem kilka podejść do tego tematu, mam metodę liczącą ile wierszy jest w pliku, ale jak podstawiam pod tablice struktur pole prywatne z licznikiem wierszy, to wszystko się sypie. Może ktoś ma pomysł jak to rozwiązać :P Kod zrobiony na razie tak, żeby po prostu działało

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;

struct linia
{
	int ilosc;
	double cena;
	string nazwa;
};

class Plik
{
private:
	fstream p,f;
	linia l[5];
	string np;
	int licznikwierszy;
public:
	Plik();
	void wczytaj();
	void wyswietl() const;
	void formatuj();
	void najdluzszy();
	void zamknijplik();
	int ilewierszy();
};

int main()
{
	Plik a;
	a.ilewierszy();
	a.wczytaj();
	a.wyswietl();
	a.formatuj();
	a.zamknijplik();
	a.najdluzszy();
	system("pause");
	return 0;
}

Plik::Plik()
{
	licznikwierszy = 0;
}

int Plik::ilewierszy()
{
	string wiersz;
	while (p.good())
	{
		getline(p, wiersz);
		licznikwierszy++;
	}
	return licznikwierszy;
}

void Plik::wczytaj()
{
	cout << "Podaj nazwe pliku\n";
	cin >> np;
	p.open(np.c_str(), ios::in);
	if (p.good() == 1)
		cout << "Plik otwarty\n";
	else
		cout << "Wystapil blad\n";
	for (int i = 0; i < 5; i++)
	{
		p >> l[i].ilosc >> l[i].cena;
		getline(p, l[i].nazwa);
	}
	cout << "Dane wczytane\n";
}

void Plik::wyswietl() const
{
	for (int i = 0; i < 5; i++)
		cout << l[i].ilosc << " " << l[i].cena << " " << l[i].nazwa << endl;
}

void Plik::formatuj()
{
	f.open("ladnie.txt", ios::out);
	int licznik = 1, suma=0;
	double irc;
	for (int i = 0; i < 5; i++)
	{
		irc = l[i].ilosc*l[i].cena;
		f << setw(1) << licznik <<  "." << setw(17) << setfill('.') << left << l[i].nazwa << setw(20) << right << l[i].ilosc << setfill(' ') << setw(2) << "x" << setw(7) << l[i].cena << " zl" << setw(20) << irc << " zl\n";
		suma += irc;
		licznik++;
	}
	f << setfill('-') << setw(80) << '-' << endl << setw(67) << setfill(' ') << "Razem: " << suma << " zl" << endl;
	cout << "Plik sformatowany\n";
	f.close();
}

void Plik::najdluzszy()
{
	p.open(np, ios::in);
	string wiersz[5];
	for (int i = 0; i < 5; i++)
	{
		getline(p, wiersz[i]);
	}
	p.close();
	string najdluzszy;
	for (int i = 0; i < 5; i++)
	{
		if (wiersz[i].length() > wiersz[i - 1].length())
			najdluzszy = wiersz[i];
	}
	cout << "Najdluzszy wiersz:" << endl << najdluzszy << endl << "Ilosc znakow: " << najdluzszy.length() << endl;
}

void Plik::zamknijplik()
{
	p.close();
}
3

Używaj std::vector.

0

Przesuń do ilewierszy() zamknięcie i otwarcie pliku.
W ogóle spróbuj tylko raz wczytywać plik, bo robisz to po bałaganiarsku i w wielu funkcjach otwierasz plik.

0
vpiotr napisał(a):

Przesuń do ilewierszy() zamknięcie i otwarcie pliku.
W ogóle spróbuj tylko raz wczytywać plik, bo robisz to po bałaganiarsku i w wielu funkcjach otwierasz plik.

Próbowałem ale po paru operacjach na pliku zaczynało mi wczytywać same 0 :D to co wkleiłem to doraźne rozwiązanie żeby po prostu tylko działało jakoś

0

Pewnie dlatego wczytuje ci same zera bo położenie wskaźnika czytającego dane z pliku ustawia się na sam koniec, a tam nic nie ma NULL xD. Jest coś takiego jak seekg, seekp: http://en.cppreference.com/w/cpp/io/basic_fstream.

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