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

Wczytywanie pliku w grze i error

VPS Starter Arubacloud
0 głosów
216 wizyt
pytanie zadane 23 stycznia 2018 w C i C++ przez Nast Początkujący (270 p.)

Witam wszystkich.

Mam problem dotyczy on wczytywania pliku do gry. Wydaję mi się że wszystko jest okej lecz perror zwraca błąd 

plik istnieje w folderze lecz go nie wczytuje.

Proszę o pomoc ponieważ nie mam pojęcia jak temu zaradzić poniżej wysyłam kod funkcji która ładuje plik i jej wywołanie w mainie.
 

void Level::load(string fileName, Player &player)
{
	//WCZYTUJE LEVEL
	ifstream plik;

	plik.open(fileName);
	if (plik.fail());
	{
		perror(fileName.c_str());
		system("PAUSE");
		exit(1);
	}

	string mapa;

	while (getline(plik, mapa))
	{
		_levelData.push_back(mapa);
	}

	plik.close();
	// POZYCJA GRACZA NA PLANSZY
	char pozycja;
	// WCZYTUJE CALE LINIE
	for (int i = 0; i < _levelData.size(); i++)
	{
		// WCZYTUJE POJEDYNCZE ZNAKI W LINIACH
		for (int j = 0; j < _levelData[i].size(); j++)
		{
			pozycja = _levelData[i][j];

			switch (pozycja)
			{
			case '@':
				player.getposition(j, i);
				break;
			}
		}
	}
}

___________________________________________________________________

#include <iostream>
#include <string>
#include <cstdlib>
#include <conio.h>
#include "GameCore.h"
#include "Level.h"


using namespace std;

int main()
{
	
	GameCore gameCore("poziom1.txt");
	gameCore.playGame();
	





 

2 odpowiedzi

0 głosów
odpowiedź 23 stycznia 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 23 stycznia 2018 przez Nast
 
Najlepsza
if (plik.fail()); //tu masz średnik, którego nie powinno tu być

 

komentarz 23 stycznia 2018 przez Nast Początkujący (270 p.)
Zastanawia mnie tylko to dlaczego Visual Studio nie pokazało mi takiego błędu. Dzięki za odpowiedź taka głupota a zabrała mi tyle czasu
komentarz 23 stycznia 2018 przez niezalogowany

Jako błąd na pewno nie (bo taka konstrukcja jest dopuszczalna - co wcale nie oznacza, że jest sensowana), ale mój VS w takim przypadku pokazałby ostrzeżenie:

warning C4390: ";": znaleziono kontrolowaną pustą instrukcję; czy to było zamierzone?
0 głosów
odpowiedź 23 stycznia 2018 przez draghan VIP (106,230 p.)
        perror(fileName.c_str());
        system("PAUSE");
        exit(1);

Kiedy std::ifstream sfailuje, nie ustawia zmiennej std::errno. To mechanizm z C i nie jest on najlepszy do stosowania w C++, który posiada system wyjątków. Tak samo - używanie funkcji exit jest niewskazane - to funkcja projektowana do kończenia programów C - w C++ nie pozwala na wywołanie destruktorów obiektów, które kończą życie razem z programem. Staraj się tak sterować przepływem sterowania w programie, żeby kończyć działanie z funkcji main przez zwykły return.

Wracając do Twojego problemu - jego rozwiązaniem może być ustawienie katalogu roboczego na katalog, w którym trzymasz plik "poziom.txt" lub skopiowanie tego pliku do lokalizacji, w której buduje się plik wykonywalny, czyli u Ciebie gdzieś w katalogu "Debug".

 

komentarz 23 stycznia 2018 przez Nast Początkujący (270 p.)
Dzięki za odpowiedź i rady lecz katalog roboczy jest ustawiony tam gdzie trzymam wszystkie pliki projektu więc to raczej jest ok. Jak wrzucam plik do folderu debug lub gdziekolwiek indziej program nie znajduję drogi do niego.

Podobne pytania

0 głosów
1 odpowiedź 233 wizyt
0 głosów
3 odpowiedzi 650 wizyt
0 głosów
2 odpowiedzi 1,607 wizyt
pytanie zadane 16 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...