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

Odczyt z pliku planszy i zapis do tablicy 2d - wyświetla inne znaki

Object Storage Arubacloud
0 głosów
242 wizyt
pytanie zadane 20 grudnia 2016 w C i C++ przez Monika Michalik Nowicjusz (230 p.)

Chciałam wczytać z pliku znak po znaku plansze i zapisać ją do tablicy 2d. W odpowiedzi dostaję:

, natomiast plik lavel1.txt wygląda tak:

Wczytuję poprzez "file >> _levelData[j][i];", tablica _levelData jest typu char. Czyli pobieram znak char z pliku i wpisuje do tablicy char. W czym może być problem, zmieniając w pliku lavel1.txt znaki na inne, na ekranie pojawiają się wciąż te same:

* * *

Level.cpp

#include "Level.h"
#include<fstream>



Level::Level()
{
}

void Level::load(string fileName)
{
	ifstream file;
	file.open(fileName);
	if (file.fail())
	{
		perror(fileName.c_str());
		system("pause");
		exit(1);
	}

	//zliczam ilosc znakow i linii, do wyznaczenia [line - ] [k | ]
	char byte;
	static int sign, line;
	do
	{
		byte = file.get();

		if (isprint(byte) && !isspace(byte)) sign++; //!isspace - nie jest biały znakiem
		else if (byte == '\n') line++;

	} while (!file.eof());

	//cout << "linie: " << line << endl;
	//cout << "znaki: " << sign << endl;

	int k = sign / (line + 1);
	//cout << "k: " << k << endl;

	_levelData = new char*[k];
	for (int i = 0; i < k; i++)
		_levelData[i] = new char[line];

	for (int j = 0; j <= line; j++)
	{
		for (int i = 0; i < k; i++)
		{
			file >> _levelData[j][i];
		}
	}
	file.close();

	for (int j = 0; j <= line; j++)
	{
		for (int i = 0; i < k; i++)
		{
			cout << _levelData[j][i];
		}
		cout << endl;
	}

	// zwalnianie pamieci
	for (int i = 0; i<k; i++)
		delete[] _levelData[i];

	delete[] _levelData;

}

* * *

Level.h

#pragma once
#include<iostream>
#include<string>

using namespace std;

class Level
{
public:
	Level();
	void load(string fileName);

private:
	char **_levelData;
};

 

1 odpowiedź

0 głosów
odpowiedź 20 grudnia 2016 przez maly Nałogowiec (37,190 p.)
wybrane 20 grudnia 2016 przez Monika Michalik
 
Najlepsza

Po zliczeniu ilości linii i znaków w pętli while jesteś na końcu pliku więc próba wczytania czegokolwiek więcej nie powiedzie się. Zanim zaczniesz ponownie czytać dane z plku musisz wyczyścić flagę eof i ustawić kursor w na początku plku:

file.clear();
file.seekg(0, ios::beg);

 

komentarz 20 grudnia 2016 przez Monika Michalik Nowicjusz (230 p.)

Dziękuję za odpowiedz, problem ze znakami został rozwiązany. Program uruchomił się poprawnie, po czym przy kolejnym uruchomieniu, tuż przed zakończeniem funkcji zwraca mi błąd: ".exe has triggered a breakpoint." Gdzie tutaj jest problem? Szukałam co oznacza taki komunikat, ale nie udało mi się rozwiązać problemu.

Podobne pytania

0 głosów
1 odpowiedź 1,830 wizyt
0 głosów
2 odpowiedzi 1,877 wizyt
0 głosów
1 odpowiedź 512 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Użytkownik (620 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

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

...