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

Niepoprawne wczytywanie danych z pliku

Object Storage Arubacloud
0 głosów
274 wizyt
pytanie zadane 30 października 2022 w C i C++ przez DonPatricio Nowicjusz (150 p.)

Witam. Piszę grę, w której użytkownik wciela się w menadżera klubu piłkarskiego z ligi hiszpańskiej i mam problem z wczytaniem danych klubów.

Mam zrobiony plik z danymi klubów (nazwa, nazwa stadionu, budżet, budżet płacowy) oraz funkcję, która go odczytuje.

void Klub::wczytajdane()
{
    fstream druzyna;
    druzyna.open("db/clubs.info", ios::in);
    string linia;
    int nr_linii=(nr_klubu-1)*4+1;
    int aktualny_nr=1;
    while(getline(druzyna, linia))
    {
        if(aktualny_nr==nr_linii) nazwa=linia;
        if(aktualny_nr==nr_linii+1) stadion=linia;
        if(aktualny_nr==nr_linii+2) budzet=atoi(linia.c_str());
        if(aktualny_nr==nr_linii+3) budzetp=atoi(linia.c_str());
        aktualny_nr++;
    }
    druzyna.close();
}

Klubów ogólnie jest 20. Z jakiegoś powodu wczytywane dane są tylko 19 klubów, a w terminalu VS Code po pokazaniu tych 19 klubów wypisywana jest następująca linijka:

** error -1073741819 ** 

Ktoś wie o co z tym chodzi? 

komentarz 30 października 2022 przez overcq Pasjonat (21,650 p.)

Można by to trochę zoptymalizować, by nie czytać niepotrzebnie całego pliku.

void Klub::wczytajdane(
){  std::fstream druzyna;
    druzyna.open( "db/clubs.info", std::ios::in );
    std::string linia;
    unsigned nr_linii = ( nr_klubu - 1 ) * 4;
    unsigned aktualny_nr = 0;
    while( getline( druzyna, linia ))
    {   if( aktualny_nr == nr_linii )
            break;
        aktualny_nr++;
    }
    if( aktualny_nr != nr_linii )
        return;
    nazwa = linia;
    getline( druzyna, linia );
    stadion = linia;
    getline( druzyna, linia );
    budzet = atoi( linia.c_str() );
    getline( druzyna, linia );
    budzetp = atoi( linia.c_str() );
    druzyna.close();
}

Natomiast nie podałeś całego kodu, a w szczególności tego, który służy zapisywaniu danych do pliku. Może nie ma w pliku 20. klubu i odwołujesz się do zmiennych nie zainicjowanych w podanej przez Ciebie metodzie.

komentarz 30 października 2022 przez DonPatricio Nowicjusz (150 p.)

@overcq, 

Athletic Bilbao
San Mames
50000000
127120000
Atletico Madryt
Wanda Metropolitano
35000000
341040000
Cadiz
Estadio Ramon de Carranza
6500000
45977000
Celta Vigo
Estadio Balaidos
8000000
63855000
Elche CF
Estadio Manuel Martinez Valero
7500000
42672000
Espanyol Barcelona
Estadi Cornella-El Prat
10000000
72737000
FC Barcelona
Camp Nou
60000000
656429000
Getafe CF
Coliseum Alfonso Perez
12000000
69070000
Girona FC
Estadio Nuevo Los Carmenas
2500000
42724000
Osasuna
El Sadar
9000000
52134000
Rayo Vallecano
Camp de Futbol de Vallecas
12250000
49903000
Real Betis
Estadio Benito Villamarin
30000000
96725000
Real Madryt
Santiago Bernabeu
100000000
683462000
Real Valladolid
Estadio Jose Zorrilla
6000000
46686000
RCD Mallorca
Visit Mallorca Estadi
8500000
49692000
Real Sociedad
Anoeta
70000000
134199000
Sevilla FC
Ramon Sanchez Pizjuan
25000000
199855000
UD Almeria
Estadio de los Juegos Mediterraneos
3000000
50749000
Valencia CF
Mestalla
25000000
75835000
Villarreal CF
Estadio de la Ceramica
18500000
151206000

to jest ten plik z klubami i czytany jest do Valencii, Villarreal już nie jest odczytywany

komentarz 30 października 2022 przez Great Stary wyjadacz (12,340 p.)

@DonPatricio podałeś poprawny fragment kodu. Sprawdziłem go i poprawnie wczytuje podane przez Ciebie dane. Musisz mieć gdzieś indziej problem tak jak wskazał @overcq.

1 odpowiedź

+1 głos
odpowiedź 30 października 2022 przez j23 Mędrzec (194,920 p.)
wybrane 7 listopada 2022 przez DonPatricio
 
Najlepsza

Znowu ten koszmarny sposób czytania danych...

Zrób to po ludzku, wczytaj cały plik do wektora, w którym będą wszystkie kluby, które są zapisane w pliku:

class Club {
    ...
 
    std::istream & wczytajDane(std::istream &is) 
    {
        std::getline(is >> std::ws, nazwa);
        std::getline(is, stadion);
        return is >> budzet >> budzetp;
    }
};
 
...
 

std::vector<Club> readClubsFromFile(const char *name)
{
    std::vector<Club> clubs;

    std::ifstream ifs(name);
     
    Club c;
     
    while(c.wczytajDane(ifs)) {
        clubs.push_back(std::move(c));
    }
    
    return clubs;
}


int main()
{
    std::vector<Club> clubs = readClubsFromFile("db/clubs.info");
    ...
 
 
}
komentarz 7 listopada 2022 przez DonPatricio Nowicjusz (150 p.)
Rzeczywiście, pomogło. Kluby wyświetlają się poprawnie! Tylko mam pytanie? Czemu tak się dzieje?
komentarz 7 listopada 2022 przez j23 Mędrzec (194,920 p.)
Dziwne pytanie. Dzieje się tak, bo zostało to napisane poprawnie. I tyle... chyba że o coś innego pytasz.
komentarz 7 listopada 2022 przez DonPatricio Nowicjusz (150 p.)
Ktoś wyżej pisał, że mój sposób działa poprawnie u niego, u mnie nie działał poprawnie. Sposób, który zaproponowałeś działa poprawnie u mnie i stąd pytanie: czemu?
komentarz 7 listopada 2022 przez j23 Mędrzec (194,920 p.)
Ciężko powiedzieć. Widziałem już ten kiepski sposób czytania danych u innych i u nich działał. Z kodu, który podałeś, trudno wywnioskować, co jest nie tak, bo błąd prawdopodobnie leży w innym miejscu.

Podobne pytania

0 głosów
2 odpowiedzi 116 wizyt
pytanie zadane 13 grudnia 2018 w C i C++ przez GóralGienek Nowicjusz (240 p.)
0 głosów
1 odpowiedź 230 wizyt
pytanie zadane 4 października 2020 w Java przez sobussss Początkujący (350 p.)
0 głosów
1 odpowiedź 557 wizyt

92,555 zapytań

141,402 odpowiedzi

319,542 komentarzy

61,939 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!

...