• 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

Cloud VPS
0 głosów
479 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 (195,240 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 (195,240 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 (195,240 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ź 418 wizyt
pytanie zadane 14 lutego 2021 w C i C++ przez poczatekcpp Nowicjusz (150 p.)
0 głosów
1 odpowiedź 486 wizyt
pytanie zadane 21 sierpnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)

93,456 zapytań

142,452 odpowiedzi

322,721 komentarzy

62,837 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

Kursy INF.02 i INF.03
...