• 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
857 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 965 wizyt
pytanie zadane 11 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 310 wizyt
0 głosów
3 odpowiedzi 1,108 wizyt
pytanie zadane 4 października 2017 w C i C++ przez Kamil Początkujący (430 p.)

93,440 zapytań

142,431 odpowiedzi

322,678 komentarzy

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

...