Labyrinth aus Textdatei einlesen und in Konsole ausgeben
-
Hi, ich muss ein Labyrinth aus einer Textdatei einlesen und und in der Konsole ausgeben. dazu habe ich auch schon ein paar Dinge hier gefunden, allerdings wurden immer Komponenten verwendet, die ich noch nicht kenne, wie zum Beispiel std::cerr .
Meine txt datei hat folgende Form:5 7 2 0 2 6 ####### # # # # # # ### #######
Die erste Zahl ist die Höhe, die zweite Zahl ist die breite, die dritte Zahl ist die Zeile des Startpunktes, die vierte Zahl ist die Spalte des Startpunktes, die fünfte zahl ist die Zeile des Zielpunktes, die sechste Zahl die Spalte des Zielpunktes. Die Rauten# stellen die Mauern im Labyrinth dar. Jedes Leerzeichen ist eine freie Stell. Es gibt also 5 Zeilen und 7 Spalten. Das Labyrinth ist ein zweidimensionales Feld.
Ich weiss nicht recht, wie ich die Informationen da separiert rausziehen kann.
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
Ich musste die Zeilenumbrüche mit /n markieren, da die Rauten sonst falsch formatiert gewesen wären auf dieser Seite.
Du kannst das als Code markieren.
Schreibe ``` vor und nach dem Code.
Oder markiere ihn mit der Maus und clicke auf </> über dem Editfenster.
-
Dieser Beitrag wurde gelöscht!
-
@DirkB sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
ch dem Code.
Oder markiere ihn mitdanke, ich habe es korrigiert
-
#include <limits> #include <cstdlib> #include <vector> #include <string> #include <fstream> #include <iostream> struct coord_t { unsigned y, x; }; std::istream& operator>>(std::istream &is, coord_t &coord) { coord_t tmp; if (is >> tmp.y >> tmp.x) coord = tmp; return is; } class maze_t { coord_t dimensions; coord_t start; coord_t goal; std::vector<std::string> field; friend std::istream& operator>>(std::istream &is, maze_t &maze) { maze_t tmp; if (!(is >> tmp.dimensions >> tmp.start >> tmp.goal)) return is; is.ignore(std::numeric_limits<std::streamsize>::max(), ('\n')); tmp.field.resize(tmp.dimensions.y); for (auto &row : tmp.field) { if (!std::getline(is, row) || row.length() != tmp.dimensions.x) { is.setstate(std::ios_base::failbit); return is; } } maze = tmp; return is; } friend std::ostream& operator<<(std::ostream &os, maze_t const &maze) { for (auto const &row : maze.field) os << row << '\n'; return os; } }; int main() { auto const filename{ "maze.txt" }; std::ifstream is{ filename }; if (!is.is_open()) { std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n"; return EXIT_FAILURE; } maze_t maze; if (!(is >> maze)) { std::cerr << "Couldn't read maze from \"" << filename << "\" :(\n\n"; return EXIT_FAILURE; }; std::cout << maze; }
-
@Swordfish
danke, wofür benötige ich die Bibliotheken <limits> und <cstdlib> ?
std::cerr wurde bei uns noch nicht eingeführt, funktioniert das wie std::cout?
-
@Swordfish sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
maze_t maze;
if (!(is >> maze)) {
std::cerr << "Couldn't read maze from "" << filename << "" :(\n\n";
return EXIT_FAILURE;
};ich habe den identischen Code mit meiner Datei maze.txt ausprobiert und bekomme die Meldung "Couldnt read maze from "maze.txt" :("
Die Datei ist exakt so wie oben gegeben und liegt im gleichen Ordner wie meine cbp.
wo könnte ein fehler liegen?
-
<cstdlib>
fürEXIT_FAILURE
<limits>
für std::numeric_limits<>
std::cout
ist einstd::ostream
der nachstdout
(Standardausgabe) schreibt,std::cerr
ist einstd::ostream
der nachstderr
(Standardfehlerausgabe) schreibt.
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
wo könnte ein fehler liegen?
Ich habe nichts anderes gemacht als die 8 Zeilen die Du gepostet hast in eine Datei
maze.txt
kopiert. Check mal ob in jeder Zeile ab der 4. auch wirklich nur 7 Zeichen stehen.
-
@Swordfish
habe den Fehler gefunden, in meiner 6. Zeile haben die Leerzeichen hinter der Raute gefehlt.
Das Labyrinth wird mir jetzt ausgegeben.
Müssten der Start- und Zielpunkt da schon mit ausgegeben werden oder ist das bei mir auch noch falsch? es sind nur die Rauten zu sehen.
Und hat der Name friend irgendeine Bedeutung?
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
Müssten der Start- und Zielpunkt da schon mit ausgegeben werden
Ne, gibt mein Code nicht aus.
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
Und hat der Name friend irgendeine Bedeutung?
-
@Swordfish
Okay sind die Koordinaten schon in der Klasse maze_t in coord_t start und coord_t goal gespeichert, sodass ich diese nur im Labyrinth ausgeben muss?
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
Hi, ich muss ein Labyrinth aus einer Textdatei einlesen und und in der Konsole ausgeben. dazu habe ich auch schon ein paar Dinge hier gefunden, allerdings wurden immer Komponenten verwendet, die ich noch nicht kenne, wie zum Beispiel std::cerr .
Meine txt datei hat folgende Form:5 7 2 0 2 6 ####### # # # # # # ### #######
Die erste Zahl ist die Höhe, die zweite Zahl ist die breite, die dritte Zahl ist die Zeile des Startpunktes, die vierte Zahl ist die Spalte des Startpunktes, die fünfte zahl ist die Zeile des Zielpunktes, die sechste Zahl die Spalte des Zielpunktes. Die Rauten# stellen die Mauern im Labyrinth dar. Jedes Leerzeichen ist eine freie Stell. Es gibt also 5 Zeilen und 7 Spalten.
Da das Labyrinth doch durch die Rauten in der Datei beschrieben ist, wofür benötigt man da die Zahlen, die Breite und Höhe usw. angeben?
Das ergibt sich doch von selbst aus den Rauten?
-
@Belli
Das ist so gegeben, da es auch möglich sein soll andere Labyrinthe einzulesen und auch Zeilen und Spalten komplett leer sein könnten, falls man zum Beispiel ein leere Zeile ganz unten anhängt
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
sind die Koordinaten schon in der Klasse maze_t in coord_t start und coord_t goal gespeichert
Ja.
-
@Swordfish
gibt es auch die Möglichkeit, das maze in einem Array zu speichern und von dort auszugeben? damit wäre es vermutlich einfacher nachfolgend einen Spieler durch das Labyrinth zu bewegen oder?
-
Auf
maze_t::field
kannst Du zugreifen wie auf ein Array (maze.field[y][x]
) und@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
@Swordfish
einen Spieler durch das Labyrinth zu bewegenist doch nichts anderes als sich seine Koordinaten zu merken und je nach Benutzereingabe und im Maze vorhandenen Wänden zu bewegen?
-
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
@Belli
Das ist so gegeben, da es auch möglich sein soll andere Labyrinthe einzulesen und auch Zeilen und Spalten komplett leer sein könnten, falls man zum Beispiel ein leere Zeile ganz unten anhängtNa und? Die Zeilen mit den Rauten müssen - zumindest in der aktuellen Lösung - vollständig sein, dh. eine leere Zeile muss entsprechend viele Leerzeichen haben:
@c-Isildur sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
@Swordfish
habe den Fehler gefunden, in meiner 6. Zeile haben die Leerzeichen hinter der Raute gefehlt.Die Angaben können also maximal zur Plausibilitätsprüfung taugen, falls ich nicht irgendwas übersehe ....
-
@Belli sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
Die Zeilen mit den Rauten müssen - zumindest in der aktuellen Lösung - vollständig sein, dh. eine leere Zeile muss entsprechend viele Leerzeichen haben
Man könnte natürlich hier
@Swordfish sagte in Labyrinth aus Textdatei einlesen und in Konsole ausgeben:
if (!std::getline(is, row) || row.length() != tmp.dimensions.x) { is.setstate(std::ios_base::failbit); return is; }
im Falle von
row.length() < tmp.dimensions.x
mit Leerzeichen auffüllen und weitermachen. Ich habe da nicht viel Hirnarbeit investiert. Die Plausibilität vonstart
undgoal
wird auch nicht geprüft, könnte man auch noch machen.