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

Tablica wskaźników na strukturę z danymi z pliku

Object Storage Arubacloud
0 głosów
309 wizyt
pytanie zadane 20 grudnia 2017 w C i C++ przez daqeck Nowicjusz (200 p.)

Witam

Mam problem z zadaniem.

Muszę utworzyć tablicę (wielkości: ilości linijek) wskaźników na strukturę wynik. Początkowa wartość wskaźników ma równać się nullptr. A następnie trzeba wczytać wyniki z pliku z wynikami do tablicy. Pamięć mam alokować w miarę dodawania nowych elementów.

Zrobiłem coś takiego:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct wynik
{
	string nick;
	int score;
};


bool createExampleFile(const string & name)
{
	ofstream o(name);
	if (!o.is_open())
		return false;
	o << "tomek 12\ntomek 534\nja 21\nccc 323\nsuper_gracz 888\nja 123\nja 20\nja 323\nja 24\nja 23\nja 10\ntomek 54\ntomek 24\nja 13\nsuper_gracz 88\nsuper_gracz 778\nsuper_gracz 999\nja 44";
	o.close();
	return true;
}
int main()
{
	//0
	const int initSize = 5;
	string file_name = "wyniki.txt";
	createExampleFile("C:\\Users\\user\\Desktop\\" + file_name);



	fstream plik("C:\\Users\\user\\Desktop\\" + file_name, ios_base::in);
	if (!plik.is_open())
	{
		cout << "Blad otwarcia pliku";
		exit(1);
	}


	string nazwa;
	int liczba;
	int i = 0;
        string linia;
	int n = 0;

	while (getline(plik, linia)) n++;          //liczy linijki

	wynik * tab3 = new wynik [n]{};

	while (plik >> nazwa>> liczba)
	{
		tab3[i] = new wynik;         // <------------- problem
		tab3[i].nick = nazwa;
		tab3[i].score = liczba;
		i++;
	}

	for (int j = 0; j < n; j++)
	{
		cout << tab3[j].nick << " " << tab3[j].score << endl;
	}

	delete[] tab3;


	plik.close();

	return 0;
}

Widzę że debugger zaznacza mi błąd 52 linijce kodu, ale nie mam pojęcia jak zrobić żeby każda tablica tworzyła nową strukturę.

Help

1 odpowiedź

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

Powinno być:

wynik ** tab3 = new wynik* [n];

i wtedy nie:

tab3[i].nick = nazwa;
tab3[i].score = liczba;

tylko

tab3[i]->nick = nazwa;
tab3[i]->score = liczba;

 

komentarz 20 grudnia 2017 przez daqeck Nowicjusz (200 p.)

No ok teraz debugger pokazuje że wszystko jest ok, ale przy wypisywaniu na ekran wyskakuje błąd z dostępem do pamięci.

for (int j = 0; j < n; j++)
	{
		cout << tab3[j]->nick << " " << tab3[j]->score << endl;            //<------- tutaj błąd
		delete[] tab3[j];
	}
	delete[] tab3;

Treść błędu: Exception thrown at 0x00E32EA7 in Lab9.exe: 0xC0000005: Access violation reading location 0x0000001C.

komentarz 20 grudnia 2017 przez j23 Mędrzec (194,920 p.)

Zapomniałeś "przewinąć" strumień. Pierwszy while liczy linie, a drugi je czyta, tyle że nie ma już nic do przeczytania, dlatego tablica tab3 jest "pusta". Użyj metod clear() i seekg().

komentarz 20 grudnia 2017 przez daqeck Nowicjusz (200 p.)
Super teraz wszystko działa :D
Musiałem jeszcze zrobić pętle żeby każdy tab3[n] tworzył nową strukturę i teraz wszystko śmiga

Dzięki wielkie!
komentarz 20 grudnia 2017 przez j23 Mędrzec (194,920 p.)

Przecież w pętli czytającej tworzyłeś nowy obiekt:

while (plik >> nazwa>> liczba)
{
        tab3[i] = new wynik; // <---
        ...

 

Podobne pytania

0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 14 lutego 2021 w C i C++ przez poczatekcpp Nowicjusz (150 p.)
0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 21 sierpnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...