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

Niepoprawne wczytywanie danych z pliku

Cloud VPS
0 głosów
576 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 (22,600 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,660 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 (195,240 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 (195,240 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 (195,240 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 159 wizyt
pytanie zadane 13 grudnia 2018 w C i C++ przez GóralGienek Nowicjusz (240 p.)
0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 4 października 2020 w Java przez sobussss Początkujący (350 p.)
0 głosów
1 odpowiedź 779 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 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
...