Text aus Textdatei laden



  • Hallo Leute,

    hab eine Frage:
    Wie lädt man Zeichen aus einer Textdatei in die Konsole? Ich brauche das für ein 2D-Matrix-Spiel, ich will sozusagen eine Map einfügen, als Beispiel:

    //map.txt

    0000000000000000
    0,,,,,,,,,,,,,,0
    0,,,11111111,,,0
    0,,,1..☺...1,,,0
    0,,,1......1,,,0
    0,,,111..111,,,0
    0,,,,,,,,,,,,,,0
    0000000000000000

    ^diese Map soll aus der Textdatei map.txt in die Konsole reinkommen, aber WIE? Das ist die Frage. Danke im Voraus 😉



  • Hi,

    das machst du mit der Funktion 'get'. Hier ein Beispiel zur formatierten Ausgabe der Zeichen in einer Textdatei:

    while (!in.eof ())
     {
        char c;
        c = in.get ();
        std::cout<<c;
     }
    

    [EDIT] Natürlich gehört 'in' zum Filestream, also vor der Schleife musst du noch deine Datei öffnen:

    #include <fstream>
    std::ifstream in ("Pfad://blabla.txt");
    

    MfG mikey.



  • Vielen Dank Mikey! 😉

    Aber es wird nur das erste Zeichen ausgegeben... es müssen ja alle Zeichen irgendwie rein kommen 🙂



  • Naja, du kannst es doch so machen:

    std::string c;
    
        std::ifstream in ("text.txt");
        while (!in.eof ())
        {
            c += in.get ();
        }
        std::cout<<c;
    

    So wird die ganze Datei im String abgespeichert. Um dann z.B. für die x und y Achse jeweils eine Dimension anzulegen, kannst du mittels

    if (c [c.length () -1] == '\n')
    

    ...abfragen, ob ein Zeilenumbruch auftaucht. Wenn dies der Fall ist, kannst du in der if Anweisung z.B. die Variable der zweiten Dimension um eins inkrementieren.

    MfG mikey.



  • Oh nein danke es hat sich schon erledigt 😉

    Dem char fehlte es einfach an Zeichen, so hab ich c einfach mit string deklariert, und die ganze Map wurde somit angezeigt.

    void main(void)
    {
      std::ifstream in ("map.txt");
      while ( !in.eof () )
      {
        string c;
        c = in.get (); 
        std::cout << c;
      }
      getch ();
    }
    

    Trotzdem vielen vielen Dank! Das sage ich so weil ich schon stundenlang versuche aus der MSDN irgendwas rauszuquetschen, da wird man aber verrückt 😮



  • Und so kannst du es in ein zweidimensionales Array abspeichern:

    unsigned int i = 0;
        std::string c [100]; //Zweidimensionales Feld aus chars
    
        std::ifstream in ("text.txt");
        while (!in.eof ())
        {
            c [i] += in.get ();
            if (c [i] [c [i].length () -1] == '\n')
                i++;
        }
    

    Oder noch einfacher:

    while (!in.eof ())
        {
            getline (in, c [i]);
            i++;
        }
    


  • BTW:

    void main(void) 
    { 
      std::ifstream in ("map.txt"); 
      while ( !in.eof () ) 
      { 
        string c; 
        c = in.get (); 
        std::cout << c; 
      } 
      getch (); 
    }
    

    Dein Code ist übrigens sehr unperfomant sowie das std::string ist wirklich unnötig. Benutzer doch einfach char, wie ich es dir gezeigt habe. So funktioniert es auch. Denn du initialisierst den string innerhalb der Schleife, und somit wird bei jedem Durchlauf extra der Konstruktor von std::string aufgerufen, Speicher alloziiert, Speicher wieder freigegeben, Funktionsaufrufe getätigt, und und und. Das geht gewaltig auf die Geschwindigkeit. Wenn du mal eine sehr große Map hast, könntest du dir diese verlorene Rechenzeit bestimmt besser wo anders einsetzen ...


Anmelden zum Antworten