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

złe wczytywanie danych

Object Storage Arubacloud
0 głosów
356 wizyt
pytanie zadane 8 lipca 2015 w C i C++ przez niezalogowany
otagowane ponownie 8 lipca 2015

Witam:)

Tworzę pewnego rodzaju symulator i potrzebuję pomocy. Zapis pliku wygląda ok, lecz wczytywanie cos nie działa pokazuje mi:
1
0
0
0
0
0
Dlaczego??

Dodam tylko, iż tablice to zmienne globalne.

void zapis()
{
    fstream save;
    save.open("save.sav", ios::out);

    for(int i=0; i<=5; i++)
    {
        save<<lvl_bud[i]<<endl;
    }

    for(int i=0; i<=3; i++)
    {
        save<<lvl_woj[i]<<endl;
    }

    for(int i=0; i<=3; i++)
    {
        save<<lvl_sur[i]<<endl;
    }

    for(int i=0; i<=15; i++)
    {
        save<<il_woj[i]<<endl;
    }

    for(int i=0; i<=3; i++)
    {
        save<<il_sur[i]<<endl;
    }

    exit(0);
}

void wczytaj()
{
    fstream save;
    save.open("save.sav",ios::in);

    if(save.good()==false)
    {
        cout<<"Nie mozesz wczytac";
        menu();
    }

    int nr_linii=1;
    string linia;

    while(getline(save,linia))
    {
        for(int i=nr_linii-1; i<=5; i++)
        {
            lvl_bud[i];
            nr_linii++;
        }



    }
    cout<<lvl_bud[0]<<endl<<lvl_bud[1]<<endl<<lvl_bud[3]<<endl<<lvl_bud[4]<<endl<<lvl_bud[5]<<endl;
    cout<<"Zakonczono wczytywanie. Nacisnij cokolwiek by kontynuowac."<<endl;
    getch();
    exit(0);
}

 

2 odpowiedzi

0 głosów
odpowiedź 8 lipca 2015 przez 0e85dc6eaf Dyskutant (8,840 p.)

Do lvl_bud[i] nic nie przypisujesz, sprawdź lvl_bud[i]=linia; i ta podwójna pętla Ci nic nie daje w tym przypadku, 

for(int i=0; i<=5;i++)
{
getline(save,linia);
lvl_bud[i]=linia;
}

 

komentarz 8 lipca 2015 przez niezalogowany
W którym miejscu dać ten fragment kodu??
komentarz 8 lipca 2015 przez 0e85dc6eaf Dyskutant (8,840 p.)
Tam gdzie masz while(getline(save, linia)){for{...}}
komentarz 8 lipca 2015 przez 0e85dc6eaf Dyskutant (8,840 p.)
To Ci już kolega DiZZie napisał w całości ten kod ;)
0 głosów
odpowiedź 8 lipca 2015 przez DiZZie Gaduła (3,170 p.)

Zamiast tej pętli while z getline napisz

string buffer;
for(int i=0; i<=5; i++) //zakładając, że tablica ma 6 elementów
    {
        getline(save, buffer); //musisz pobrać dane jako string
        lvl_bud[i] = atoi(buffer.c_str()); //konwersacja ze stringa na int, dołącz bibliotekę               <cstdlib>
    }

 i analogicznie do wszystkich innych tablic. Zmienne nr_linii i linia nie są potrzebne. Na samym końcu zapomniałeś wypisać lvl_bud[2].

komentarz 8 lipca 2015 przez niezalogowany
Nie mam pojęcia jak to zrobiłes ale u mnie masz szacun. Proszę mi tylko dlaczego mój sposób nie działał, wszystko robiłem tak naj Pan Mirosław na filmie.
komentarz 8 lipca 2015 przez DiZZie Gaduła (3,170 p.)

No niezupełnie, jeśli chciałbyś to napisać sposobem, który jest na filmie Pana Mirosława to musiałoby wyglądać to mniej więcej tak

int nr_linii=1;
string linia;
 
    while(getline(save,linia))
    {
        if(nr_linii <= 6 )
        {
              lvl_bud[nr_linii-1] = atoi(linia.c_str());
        }
        else if( nr_linii <= 6 + ilosc elementów następnej tablicy)
        {
           //konwersacja na int i przypisanie do zmiennej
        }
        //else if ...
        nr_lini++;
    }

 

komentarz 8 lipca 2015 przez niezalogowany
No ok, a jak zrobić kolejne tablice?? Bo mam jeszcze do zrobienia 4 tablice i nie wiem jak to zrobić.
komentarz 8 lipca 2015 przez DiZZie Gaduła (3,170 p.)

Najprościej będzie napisać to tym pierwszym sposobem, który Ci podałem, jedyne co musisz zmieniać w tej pętli to warunek (zależny od ilości elementów w tablicy) oraz samej tablicy. Przykładowo dla tablicy

int tablica[10]

pętla będzie wyglądać następująco:

for(int i=0; i < 10; i++)
    {
        getline(save, buffer);
        tablica[i] = atoi(buffer.c_str());
    }
komentarz 8 lipca 2015 przez niezalogowany
A można inaczej?? Bo mi zależy na czytelności i żebym wiedział która tablica za co odpowiada.
komentarz 8 lipca 2015 przez DiZZie Gaduła (3,170 p.)
Mogę się mylić, ale wydaje mi się że to najlepszy sposób. Co do czytelności w samym kodzie to wystarczy odpowiednio nazwać tablice żeby się łatwo połapać lub można zostawić kilka komentarzy ;)
komentarz 8 lipca 2015 przez niezalogowany
edycja 8 lipca 2015
:( Skoro tak mówicie, to niech tak będzie. Może w przyszłości coś mi się uda zrobić. No nic, dzięki wszystkim za pomoc. Jeśli jednak znalazłby ktoś jakąś dobrą metodę to proszę podać.

Podobne pytania

0 głosów
1 odpowiedź 132 wizyt
pytanie zadane 18 czerwca 2018 w C i C++ przez kietek Początkujący (280 p.)
0 głosów
2 odpowiedzi 157 wizyt
pytanie zadane 15 maja 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
+1 głos
2 odpowiedzi 2,666 wizyt
pytanie zadane 4 lutego 2016 w C# przez MichK Użytkownik (550 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 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!

...