Dziwna sprawa z przypisywaniem wartosci pola w obiekcie.
Ostatnio zmodyfikowano 2017-01-08 21:34
Clarc Temat założony przez niniejszego użytkownika |
Dziwna sprawa z przypisywaniem wartosci pola w obiekcie. » 2017-01-08 19:14:46 Witam, piszę prostą grę w której będzie możliwość zapisywania i wczytywania gry. nie będę wrzucał tutaj całego kodu bo to się mija z celem zrobię prosty przykład który ukaże mój problem. class Aaa { public: int x; Aaa() { x = 0 } };
class Gracz { public: Aaa obiekt; void zapisz(); void wczytaj(); }
metoda zapisz oraz wczytaj odpowiadają kolejno za wczytanie i zapisanie do pliku i wyglądają następująco void Gracz::wczytaj() { int nr_linii = 1; string linia; fstream plik; plik.open( "save/zapisz.txt", ios::in ); if( plik.good() == false ) { cout << "Nie udalo sie otworzyc pliku!"; exit( 0 ); } getline( plik2, linia ); obiekt->x = atoi( linia.c_str() ); plik.close }
void Gracz::zapisz() { int nr_linii = 1; string linia; fstream plik2; plik2.open( "save/zapisz.txt", ios::out ); if( plik2.good() == false ) { cout << "Nie udalo sie otworzyc pliku!"; exit( 0 ); } plik2 << obiekt->x; plik.close }
Na czym polega problem? otóż na wstępie program się kompiluje. jeśli uruchomimy program i wywołamy metodę zapisz wykona się ona poprawnie. Jeśli uruchomimy program i wywołamy metodę wczytaj tez zadziała ona poprawnie. natomiast jeśli uruchomimy program i wywołamy metodę zapisz a następnie metodę wczytaj wyskakuje program przestał działać. drogą dedukcji i debugerem zauważyłem że błąd wyskakuje w tej linijce jeśli wcześniej damy metodę zapisz obiekt->x = atoi( linia.c_str() );
nawet gdy w metodzie wczytaj usuniemy wszystko i damy coś takiego jest taki sam błąd w przeciwną stronę gdy najpierw damy wczytaj a potem zapisz błąd występuje w tej linijce przypominam że program się kompiluje i normalnie się uruchamia więc nie wiem co jest :/ jest ktoś mi wstanie pomóc? ewentualnie literówki w kodzie nie mają wpływu ponieważ nie kopiuje tego tylko napisałem na szybko w poście :) |
|
Gibas11 |
» 2017-01-08 19:48:12 plik.close ? Możesz to wywalić i będzie dobrze, destruktor sam to załatwi a ty zdaje się zapomniałeś o nawiasach. No i chyba masz gdzieś globalnie (albo w klasie) zadeklarowane std::fstream plik , bo w drugiej funkcji nie powinno być takiego obiektu (z innego wczytujesz, inny zamykasz). |
|
karambaHZP |
» 2017-01-08 21:34:53 getline( plik2, linia );
obiekt->x = atoi( linia.c_str() ); |
Takie coś z powodzeniem możesz zamienić na coś takiego: plik2 >> obiekt->x; Oczywiście pod warunkiem, że wczytujemy do zmiennej przechowującej liczbę lub pojedynczy wyraz. Jeśli chodzi o twój błąd, Gibas11 pewnie ma rację. Możesz spróbować ustawić wskaźniki plikowe na początek pliku, a jeśli to nic nie da, możesz mieć wciąż niezamknięty plik i próbujesz go ponownie otworzyć. |
|
« 1 » |