Ifstream/ofstream, datei auslese (unbekannte größe)
-
Hey Leute
Ich hab ein kleines problem.
Ich möchte eine 2d Map erstelle, die Ladefunktion klappt auch soweit.
Ich muss halt nur in der Schleife angeben, wie hoch die Map ist und wie weit.Ich habe aber ein problem damit, die größe immer fest anzugeben.
Gibt es eine möglichkeit, mit einem 2d vector und einer schleife, so lange zu laden, bis man am Ende der Datei angelangt ist.
Die Daten sind so in der Dateui gespeichert:
1,1|2,1|1,1|
1,1|2,1|1,1| Die erste Zahl ist das Sprite, die zweite nach dem , ist die Collision und beide gehören zueinander, worauf béi jedem paar ein | folgt.Ich hoffe ihr könnt mir helfen
MFG Sheridon
-
Spricht denn etwas dagegen, die Datenstruktur dynamisch wachsen zu lassen?
-
die map wird nacher durch einen Map Editor erstellt, ich denke also es würde nichts dagegen sprechen, die map soll ja dynamisch erstellbar sein.
-
Wieso map? Ich erkenne hier keinen Key?
-
nein nein, nicht der container map ^^ ich meine ich benutze einen 2d vektor für eine Spiel Karte=(Map). Ich habe aber eine for schleife, bei der ich die spaltenanzahl und die weite angeben muss, um halt die map aus der text datei zu laden.
Da ich aber verschiedene Maps mit verschiedener größe via Karten Editor erstellen will, soll halt die schleife so lange laufen, bis alles herausgeladen wurde, und auch selber die Zeilenenden erkennen. Sprich also eine Schleife ohne feste Werte zum durchlaufen. (Dynamisch)
weiß bloss überhaupt nicht wie ich das machen soll.
-
Sheridon schrieb:
Da ich aber verschiedene Maps mit verschiedener größe via Karten Editor erstellen will, soll halt die schleife so lange laufen, bis alles herausgeladen wurde, und auch selber die Zeilenenden erkennen. Sprich also eine Schleife ohne feste Werte zum durchlaufen. (Dynamisch)
dann lies Dir bitte mal diesen Beitrag durch.
-
danke, werde es mir später genau durchschauen, sieht aber schon sehr gut aus, muss halt nurnoch die , und | abgrenzen davon

-
Wobei deine Datenstruktur, falls sie rechteckig ist, wohl weniger ein vector<vector<Datentyp>> sein sollte, sondern eher ein vector<Datentyp> mit einem Wrapper drumrum, der Zeilen- und Spaltenindex auf den passenden Index in der 1D-Datenstruktur umrechnet. Ist in der Regel viel effizienter.
Sheridon schrieb:
danke, werde es mir später genau durchschauen, sieht aber schon sehr gut aus, muss halt nurnoch die , und | abgrenzen davon

Das ist eine Aufgabe des Leseoperators deines Datentyps.
-
Sheridon schrieb:
danke, werde es mir später genau durchschauen, sieht aber schon sehr gut aus, muss halt nurnoch die , und | abgrenzen davon

dann schau Dir im Listing dieses Beitrags die Funktion
Char<>an.
-
Im Prinzip läuft es auf so etwas raus:
#include <iostream> #include <fstream> #include <vector> // #include "is_endl.h" // Char<> struct MapElement { int sprite_; int collision_; }; std::istream& operator>>( std::istream& in, MapElement& e ) { // Format: "sprite#,collision|" return in >> e.sprite_ >> Char<','> >> e.collision_ >> Char<'|'>; } int main() { using namespace std; ifstream in("Map.txt"); vector< MapElement > Map; // 2D-map auf 1D-Datenstruktur abgebildet; siehe Rat von SeppJ int weite = -1; for( MapElement pixel; in >> pixel; ) { Map.push_back( pixel ); if( weite < 0 && is_endl( in ) ) // nur einmal(!) Zeilenende und damit die Breite erkennen weite = Map.size(); } return 0; }.. ohne großartige Fehlerbehandlung.
is_endlundChar<>findest Du hinter den Links, die ich vorher erwähnt habe.Gruß
Werner