Problem mit Maploader



  • 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



  • Danke ich werde es sofort ausprobieren.

    Leider sind meine Kenntnisse mit stringstreams und Manipulatoren sehr begrenzt.



  • Meierei schrieb:

    error C2110: Zwei Zeiger koennen nicht addiert werden

    Mein Fehler.

    Das war auch nicht wirklich das Wahre:

    Doch, das ist das Wahre für einstellige Zahlen. Wies mit zweistelligen geht, hab ich auch schon gezeigt.

    Nimm am besten den Snippet von akari, ich hab keinen Bock mehr.


Anmelden zum Antworten