• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ zapis danych do pliku i omijanie tej samej danej

VPS Starter Arubacloud
0 głosów
201 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez niezalogowany

Witam, mam zrobić program który wczyta zawodników maratonu z pliku(takich plików może być wiele, nie ma określonej liczby) i dla każdego uczestnika wygeneruje osobny plik z jego wynikiem. Przykładowy plik końcowy dla jednego z zawodników wygląda tak:

Zenon

2011-11-05 Maraton Gdanski 04:01:43

2011-12-08 Bieg Mikolajkowy 04:13:32

Program napisałem i działa z jednym wyjątkiem, nie bardzo wiem co zrobić żeby imię zawodnika wyświetlało się tylko raz na początku pliku a nie z każdym kolejnym dodanym maratonem. Mój plik wygląda tak:

Zenon


2011-11-05 Maraton Gdanski 04:01:43
Zenon


2011-12-08 Bieg Mikolajkowy 04:13:32

 

To jest kawałek kodu który odpowiada za zapis do pliku, wiem że aktualnie jest napisany żeby robił to co aktualnie jest zapisane do pliku, ale nie mam bladego pojęcia co zrobić żeby było inaczej.

 

void zapis_do_pliku(int ile_zawodnikow, zawodnicy tab[])
{

	ofstream *biegacze;
	biegacze = new ofstream[ile_zawodnikow];
	for (int i = 0; i < ile_zawodnikow; i++)
	{
		biegacze[i].open(tab[i].imie + ".txt", ios_base::app);
		if (biegacze[i].good() == false)
		{
			cout << "Kaszana";
		}
		biegacze[i] << tab[i].imie << "\n\n\n" << tab[i].data << "\t" << tab[i].nazwa_maratonu << "\t" << tab[i].czas << endl;
	}

}

Za każdą pomoc będę dozgonnie wdzięczny!

komentarz 1 grudnia 2018 przez j23 Mędrzec (194,920 p.)
edycja 1 grudnia 2018 przez j23

Fun fact #1: C++ to nie Java. Pamięć, którą przydzieliłeś na stercie, powinieneś później zwolnić.

Fun fact #2: tutaj tablica, a co za tym idzie alokacja, nie jest potrzebna.

komentarz 1 grudnia 2018 przez niezalogowany
Rzeczywiście zapomniałem zwolnić pamięci, a musiałem zaalokować pamieć ponieważ ile_zawodnikow jest liczbą zmienną zależną od wielkości pliku.
komentarz 1 grudnia 2018 przez j23 Mędrzec (194,920 p.)

Nie musisz tworzyć naraz wszystkich strumieni, skoro i tak zapisujesz sekwencyjnie. Nic nie stoi na przeszkodzie tworzyć strumień lokalnie we wnętrzu pętli, bez użycia new.

komentarz 1 grudnia 2018 przez niezalogowany
Tylko nie rozumiem w jaki sposób miałbym określić ilość plików które muszę stworzyć.

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2018 przez j23 Mędrzec (194,920 p.)
wybrane 1 grudnia 2018
 
Najlepsza

Użyj funkcji std::filesystem::exists, żeby sprawdzić, czy plik istnieje. Jeśli istnieje, nie wpisujesz tab[i].imie << "\n\n\n".

komentarz 1 grudnia 2018 przez niezalogowany
Gapię się na przykłady użycia tej funkcji i nie jestem w stanie zrozumieć jak mam jej poprawnie użyć, plik tworzony jest wcześniej, a dopiero potem wpisywane są do niego dane i nie wiem też co zrobić żeby działała dla wszystkich plików a nie tylko dla jednej. Byłbyś w stanie dorzucić jeszcze jedną wskazówkę?
komentarz 1 grudnia 2018 przez j23 Mędrzec (194,920 p.)
void zapis_do_pliku(int ile_zawodnikow, zawodnicy tab[])
{
	for (int i = 0; i < ile_zawodnikow; ++i)
	{
		std::filesystem::path fn = tab[i].imie + ".txt";
		bool already_exists = std::filesystem::exists(fn);

		std::ofstream os(fn, std::ios_base::app);
	
		if(!already_exists) os << tab[i].imie << "\n\n\n";
		os << tab[i].data << "\t" << tab[i].nazwa_maratonu << "\t" << tab[i].czas << '\n';
	}
}

 

komentarz 1 grudnia 2018 przez niezalogowany
Wow, dzięki wielkie! Jeszcze długa droga przede mną jeśli chodzi o programowanie, rzeczywiście nie trzeba było robić tej tablicy. Jeszcze raz dzięki wielkie!

Podobne pytania

–1 głos
1 odpowiedź 422 wizyt
0 głosów
3 odpowiedzi 454 wizyt
pytanie zadane 27 kwietnia 2019 w C i C++ przez miodowy Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 315 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...