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

Klasa z argumentami int a błąd przy odczycie z pliku txt

Object Storage Arubacloud
+1 głos
407 wizyt
pytanie zadane 8 marca 2016 w C i C++ przez Gandalf Obywatel (1,260 p.)

Cześć, mam taki problem, tworzę prostą gierkę z systemem walki, ale chcąc wczytywać wartości z pliku (atak, obrona, HP), mam problem bo jest błąd z konwersją typu.

Próbowałem używać rzutowania (int), albo atoi() ale nic nie daje.

Proszę o pomoc jak rozwiązać ten problem, ponieważ walka musi operować na zadawanych obrażeniach czyli odejmować hp przeciwnikowi..

 

// plik barbarzynca.cpp

#include <iostream>
#include <fstream>
#include <cstdlib>

#include "barbarzynca.h"

using namespace std;

void Barbarzynca::wczytajJednostki()
{
    fstream jednostka;
    jednostka.open("barbarzynca.txt", ios::in);

    if(jednostka.good() == false)
    {
        cout << "Nie udalo sie wczytac jednostki do walki :(";
        exit(0);
    }

    int line = (ktora_jednostka - 1)*3+1;
    int actual_line = 1;
    string linia;

    while(getline(jednostka, linia))
    {
        if(actual_line == line) nazwa_jednostki = linia;
        if(actual_line == line+1) HP = (int)linia;
        if(actual_line == line+2) atak = (int)linia;
        if(actual_line == line+3) obrona = (int)linia;
        actual_line++;
    }
    jednostka.close();
}

void Barbarzynca::wyswietlJednostki()
{
    cout << "Nazwa jednostki: " << nazwa_jednostki << endl;
    cout << "HP: " << HP << endl;
    cout << "Atak: " << atak << endl;
    cout << "Obrona: " << obrona << endl;
}


// plik barbarzynca.h

#include <iostream>

using namespace std;

class Barbarzynca
{
    public:

    string nazwa_jednostki;
    int HP;
    int atak;
    int obrona;
    int ktora_jednostka;

    void wczytajJednostki();
    void wyswietlJednostki();
};



plik main.cpp

#include <iostream>

#include "nekromanta.h"
#include "barbarzynca.h"


using namespace std;

int main()
{
    Barbarzynca b1;
    b1.ktora_jednostka = 1;
    b1.wczytajJednostki();
    b1.wyswietlJednostki();

    // Nekromanta n1;
    //n1.ktora_jednostka = 1;
    //n1.wczytajJednostki();
    //n1.wyswietlJednostki();
}

 

3 odpowiedzi

+1 głos
odpowiedź 8 marca 2016 przez Ceki Mądrala (5,310 p.)
wybrane 8 marca 2016 przez Gandalf
 
Najlepsza
To:
 if(actual_line == line) nazwa_jednostki = linia;
        if(actual_line == line+1) HP = (int)linia;
        if(actual_line == line+2) atak = (int)linia;
        if(actual_line == line+3) obrona = (int)linia;

Powinno wyglądać tak:

 if(actual_line == line) nazwa_jednostki = atoi(linia.c_str());
        if(actual_line == line+1) HP = atoi(linia.c_str());
        if(actual_line == line+2) atak = atoi(linia.c_str());
        if(actual_line == line+3) obrona = atoi(linia.c_str());

Widzę, że wspominałeś o funkcji atoi, ale skoro wyskakuje błąd to wypróbuj to, jeśli nie zadziała napisz jaki błąd wyskoczył ;)

komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)
Też przekopywałem ten temat na 4programmers, ale w ten sposób konwersja mi nie działa. Nawet próbowałem konwersji stoi() (string to integer)
komentarz 8 marca 2016 przez Ceki Mądrala (5,310 p.)
Być, może zapomniałeś o wywołaniu funkcji c_str() przy podaniu parametru do atoi :)
komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)
dokładnie, zapomniałem dodać funkcję c_str(), by bad, dzięki za pomoc śmiga wyśmienicie :)

kurcze aż wstyd lecieć z takim problemem na forum, ale nie mogłem sobie pomóc z tego typu rzutowaniem, ale byłem blisko :D
komentarz 8 marca 2016 przez Ceki Mądrala (5,310 p.)
Nic nie szkodzi ;) , po to tu jesteśmy, żeby sobie pomagać, jeśli jesteś zadowolony z takiego rozwiązania problemu możesz dać najlepszą odpowiedź ;)
komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)

Myślałem żeby zrobić kilka klas Rycerza, Czarodzieja, Barbarzyńcy i Nekromanty wszystkie mają podobne atrybuty (atak, obrona, hp, nazwa) więc mogą dziedziczyć z jednej klasy Postać. a jedynie przy tworzeniu dodawać specjalne właściwości dla danej klasy (tak w formie nauki).

Zastanawiam się jak miałby wyglądać system walki i zadawanych obrażeń, bo dla:

Goblina HP 40, Atak 4, Obrona 2

Szkieletor HP 35, Atak 5, Obrona 1

może mógłbyś coś podpowiedzieć? :)

komentarz 8 marca 2016 przez Ceki Mądrala (5,310 p.)
Świetny projekt jak na poukładanie sobie wiadomości o c++ obiektowym, jedyne co ci mogę powiedzieć w tej sytuacji to to, żebyś się nie poddawał i uparcie dążył do celu ;) . Jakbyś miał jakiś problem śmiało pisz :)
komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)
    srand(time(NULL));

    Barbarzynca b[4], b1;
    b1.tytulZamku();

    for(int i=0; i<4; i++)
    {
        b[i].ktora_jednostka = i+1;
        b[i].wczytajJednostki();
        b[i].wyswietlJednostki();
    }

int losowanie = rand() % b[4] + b[0];

cout << losowanie;

 

Chciałem wylosować jeden element tablicy z 4, ale mam jakiś problem z utworzeniem konkretnego warunku. Kopałem internet szukając rozwiązania, na liczbach jest to prostsze niż na tablicach i ich elementach obiektowych ;/

komentarz 8 marca 2016 przez Ceki Mądrala (5,310 p.)
edycja 9 marca 2016 przez Ceki
int losowanie = rand() % b[4] + b[0];

Odwołanie się elementu z tablicy to wyciągnięcie z niego wartości.

Ta linijka oznacza: losuj wartość między wartością wyciągniętą z 4 elementu tablicy (który nie istnieje, bo ostatnim elementem jest 3) i wartością wyciągniętą z 0 elementu tablicy.

To powinno wyglądać tak:

int losowanie = rand() % 4 + 0;
 int liczba = b[losowanie] ; 
cout<<liczba<<endl;

;)

+2 głosów
odpowiedź 8 marca 2016 przez Krawiec91 Pasjonat (19,600 p.)

Użyj stoi() albo możesz std::string konwertować na C-string za pomocą std::string::c_str() i wtedy konwertować z C-string na int, za pomocą atoi(). Przy stoi() jak dobrze pamiętam, potrzebny jest kompilator wspierający C++11.
http://www.cplusplus.com/reference/string/string/c_str/
http://www.cplusplus.com/reference/string/stoi/

komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)
tak już zrobiłem i działa, dziękuję za pomoc :)
+1 głos
odpowiedź 8 marca 2016 przez draghan VIP (106,230 p.)

Czemu uparłeś się na getline? :) Jśli dane ułożone są w znanej kolejności i oddzielone białymi znakami, to wystarczy użyć operatora >>, który wykona za nas brudną robotę.

void Barbarzynca::wczytajJednostki()
{
    ifstream jednostka;
    jednostka.open("barbarzynca.txt");
 
    if(jednostka.good() == false)
    {
        cout << "Nie udalo sie wczytac jednostki do walki :(";
        jednostka.close(); // jesli już musisz użyć exit, to zamknij plik - exit dość drastycznie kończy program, nie uruchamia destruktorów
        exit(0);
    }
    // wczytuję tylko pierwsze dane z pliku, tylko żeby pokazać koncept:
    jednostka >> nazwa_jednostki;
    jednostka >> HP;
    jednostka >> atak;
    jednostka >> obrona;

    jednostka.close();
}

 

komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)

Heh, nie do końca uparłem się na getline, wykorzystałem pomysł z którego pliku pana Mirosława, dlatego że nie wiedziałem w jaki inny sposób to wykonać.

Dopiero uczę się obiektówki, dlatego staram się eksperymentować zdobytą wiedzę :) dzięki za podpowiedź we wskazanych miejscach, mimo to plik barbarzynca.h wywala błąd po Twojej zmianie kodu ze wczytywaniem danych, dlaczego? "previous definition of 'class Barbarzynca' a mam tak:

#include <iostream>

using namespace std;

class Barbarzynca
{

    string nazwa_jednostki;
    int HP;
    int atak;
    int obrona;
    int ktora_jednostka;

    void wczytajJednostki();
    void wyswietlJednostki();
};

 

komentarz 8 marca 2016 przez Gandalf Obywatel (1,260 p.)
już poprawione i wszystko śmiga, w pliku nekromanta.h miałem mały błąd a mnie odsyłało do pliku barbarzynca.h, heh nevermind :D dzięki jeszcze raz za okazaną pomoc!
komentarz 8 marca 2016 przez draghan VIP (106,230 p.)
Powinieneś spróbować getline wymaga późniejszej konwersji - a tutaj masz już formatowane wejście, nic nie musisz konwertować. Działa to na dokładnie takiej zasadzie, jak cin>>zmienna, z tym że zamiast strumienia cin masz strumień plikowy.

Miłej i owocnej nauki. :)

Podobne pytania

0 głosów
2 odpowiedzi 733 wizyt
pytanie zadane 11 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 243 wizyt
0 głosów
3 odpowiedzi 732 wizyt
pytanie zadane 4 października 2017 w C i C++ przez Kamil Początkujący (430 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...