Problem mit Maploader



  • Ich möchte eine einfache 2D Map aus einer Textdatei laden. Dazu erstelle ich zunächst einen String oder ein char-array mit:

    map01.txt
    map02.txt
    ...
    map50.txt

    Und nun würde ich gerne eine Datei nach der anderen öffnen und in den Arbeitsspeicher laden.

    Jedoch kann ich an einen String keine Zahl anhängen.

    string map("map");
        for(short x = 0; x < 50; x++)
        {
            for(short y = 0; y < 9; y++)
            {
                mapList[x][y] = map + (i + 1) + ".txt";
            }
        }
    ifstream mapFile(mapList......
    

    So in der Art nur ich kann an einen String keine Zahl anhängen und bei char auch nicht. Wie kann ich dynamisch die map List erstellen und so...



  • mapList[x][y] = map + static_cast<char>('0' + i + 1) + ".txt";
    

    BTW ist das ein ziemlich komischer Ansatz. Was machst du da unten mit dem ifstream?



  • Naja ich wollte es so machen:

    Die mapList besteht ja dann aus 50 strings, map01.txt, ...
    Und ich öffne in einer Schleife eine Datei nach der anderen, lese jede Zeile aus und speichere sie in ein map array.

    Somit sind dann alle maps im Arbeitsspeicher.



  • Das Problem ist ja auch:

    ifstream nimmt ja nur char an, kein string.

    Muss ich jetzt also alle map-Namen in einem char-array speichern? Da wird dann außerdem eine Zahl zu einem Buchstaben?

    Wie könnte ich das am besten lösen?

    Ich hatte zuerst nen string erzeugt und dann in char umgewandelt, aber da kam ich durcheinander.



  • Du brauchst die Mapnamen überhaupt nicht zu speichern. Weshalb auch?

    Und deine Zahl-String-Umwandlung funktioniert für Zahlen bis 50 problemlos folgendermaßen:

    // i ist ein hochlaufender Integer
    "map" + ('0' + (i / 10) ) + ('0' + (i % 10) ) + ".txt";
    


  • Warum brauche ich keine mapList?

    Dann weiß man ja nicht, wieviele maps man laden muss...



  • Ich möchte einfach nur per ifstream map01.txt bis map50.txt hintereinander öffnen und jeweils die Datei in ein map-array speichern.

    Nur ifstream nimmt keine strings an.



  • string::c_str().

    Langsam komm ich mir verarscht vor. Du weißt nicht, wie viele Maps du laden sollst? Einen Post drunter schreibst du, dass es 50 sind.



  • Sorry daran hab ich nicht gedacht.

    Mal ausprobieren...



  • Soweit bin ich grad:

    class Field
    {
    	string curMap;
    	char maps[50][15][26];
    public:
    	Field();
    	~Field();
    };
    
    Field::Field()
    {
    	// Load maps
    	string map("map");
    	for(short c = 0; c < 50; c++)
    	{
    		curMap = map + static_cast<char>('0' + c + 1) + ".txt";
    	}
    }
    

    Jetzt möchte ich aus curMap char* machen und dann per ifstream öffnen und in char maps[50][15][26] laden.

    (Das sind doch 50 arrays aus 15 Zeilen und 26 Elementen, wenn ich das richtig verstanden habe?)



  • ccurMap = curMap.c_str();
    

    Funzt nicht:

    error C2440: '=' : 'const char *' kann nicht in 'char' konvertiert werden

    ccurMap ist vom Typ char.



  • Meierei schrieb:

    ccurMap ist vom Typ char.

    ja dann mach ein const char* drauß^^



  • Hallo

    wie soll auch ein Pointer auf eine Zeichenkette an einen char übergeben werden?
    Du sollst das ja auch so einsetzen :

    std::string filename = "test.txt";
    std::ifstream file(filename.c_str());
    

    bis bald
    akari



  • Yay. Danke ich werde experimentieren.



  • Was stimmt nun hier wieder nicht 😞

    class Field
    {
    	string curMap;
    	char maps[50][15][26];
    public:
    	Field();
    	~Field();
    };
    
    Field::Field()
    {
    	// Load maps
    	string map("map");
    	for(short i = 0; i < 50; i++)
    	{
    		curMap = map + static_cast<char>('0' + i + 1) + ".txt";
    		ifstream mapFile(curMap.c_str());
    
    		for(short r = 0; r < 15; r++)
    			mapFile.getline(&maps[i][r][], r);
    	}
    }
    

    error C2059: Syntaxfehler : ']'

    Wenn man das Element nicht angibt, wird einfach die ganze Zeile reingeschrieben, oder? Oder muss ich das manuell per get machen und für die Elemente auch noch ne Schleife?



  • Jetzt kommt zumindest kein Fehler mehr:

    Field::Field()
    {
    	// Load maps
    	string map("map");
    	// For each map
    	for(short i = 0; i < 50; i++)
    	{
    		curMap = map + static_cast<char>('0' + i + 1) + ".txt";
    		ifstream mapFile(curMap.c_str());
    
    		// For each row
    		for(short r = 0; r < 15; r++)
    		{
    			// For each element
    			for(short e = 0; e < 26; e++)
    				mapFile.get(&maps[i][r][e], e);
    		}
    	}
    }
    

    Ist das so korrekt?



  • Nein. Warum nicht einfach so?

    for(int i = 0; i < 50; ++i)
        ifstream in("map" + ('0' + i / 10) + ('0' + i % 10) + ".txt");
    

    Du brauchst nicht hunderttausend Variablen, die immer denselben Wert haben.



  • Ok.

    Field::Field()
    {
    	// Load maps - For each map
    	for(short i = 0; i < 50; i++)
    	{
    		ifstream mapFile("map" + ('0' + i / 10) + ('0' + i % 10) + ".txt");
    
    		if(mapFile)
    			cout << curMap << " geladen!" << endl;
    		else
    			cout << curMap << " nicht geladen!" << endl;
    
    		// For each row
    		for(short r = 0; r < 15; r++)
    		{
    			// For each element
    			for(short e = 0; e < 26; e++)
    				mapFile.get(&maps[i][r][e], e);
    		}
    	}
    }
    

    error C2110: Zwei Zeiger koennen nicht addiert werden



  • Das war auch nicht wirklich das Wahre:

    curMap = map + static_cast<char>('0' + i + 1) + ".txt";
    

    Es kommt dann nämlich mapK.txt, mapL.txt und so weiter raus...



  • Hallo

    das muß auch so aussehen

    #include <sstream>
    #include <iomanip>
    ..
      for(int i = 0; i < 50; ++i)
      {
        std::stringstream filename;
        filename << "map";
        filename.width(2);
        filename.fill('0');
        filename << i << ".txt";
        std::ifstream in(filename.str().c_str());
        ... // Mache etwas wenn Datei durch in geöffnet wurde
      }
    

    bis bald
    akari


Anmelden zum Antworten