Hilfe bei Fstream



  • Hallo Leute ich bin dabei ein Spiel so ähnlich wie 2d Super Mario zu machen und will aber meine Maps in Form von .txt Dateien speichern.

    Wie schreibe ich nun die Funktion mit der ich auslesen kann wie die Map aussieht also x , y Koordinate usw.

    ich hab schon herausgefunden dass man das ungefähr so macht :

    fstream f;

    f.open("Map.txt", ios::in);
    char s[256];
    f.getline(s, sizeof(s));

    Wie kann ich nun aber zwischen Zeilen und Spalten und Tabulatoren unterscheiden oder muss ich immer die ganze Datei lesen lassen um das Wort zu finden das ich suche ??

    Danke Dr4xt3r



  • Achja und noch was :
    was macht getline(); eigentlich ?



  • Hi,

    Dr4xt3r schrieb:

    f.open("Map.txt", ios::in);

    heisst es nicht fstream::in ?
    Stell unbedingt sicher, dass eine Zeile wirklich nur maximal 256 Zeichen lang ist. Ansonsten wird der Rest nämlich verworfen

    Dr4xt3r schrieb:

    was macht getline(); eigentlich ?

    Das holt dir solange Zeichen, bis es ein Zeilenendezeichen liest.

    Vielleicht hilft dir strtok weiter. Falls du aber einfach nur wie
    hhhhhhhhhhhhhhhhh
    ssshhhhhhhhhhssss
    ssssssssssshsssss
    sssssssssssssssss
    sssssssssssssssss
    speicherst, wird das folgende generell besser sein:
    Da wir hier in C++ sind und fstream nur von istream abgeleitet ist, machs ungefähr so:

    fstream f(map.txt, fstream::in);
    string s;
    while(!f.eof())
    {
       f >> s; //Stream-Operator: liest Zeile und schreibt sie in string
    }
    //Zugriff auf char:
    cout << s[0];
    

    Wenn du große Maps in Textdateien speicherst, empfehle ich dir dringend eine Kompression. (zlib etc.)

    mfg, Hans



  • http://www.google.de/search?num=100&hl=de&q=was+macht+getline%28%29%3B+eigentlich+%3F+&meta=lr%3Dlang_de%7Clang_en

    ^^

    sagt das nicht eigtl schon der name?

    es kopiert die zeile aus dem stream in den string und löscht sie dann in dem stream...

    alternativ: msdn...



  • unskilled schrieb:

    alternativ: msdn...

    ich würde sagen für diesen Zweck besser http://cplusplus.com
    MSDN will einem oft Windoof-spezifische Funtionen andrehen

    mfg, Hans



  • Dr4xt3r schrieb:

    ...ich bin dabei ein Spiel so ähnlich wie 2d Super Mario zu machen...
    ... Wie schreibe ich nun die Funktion mit der ich auslesen kann...

    Sorry, aber von jemanden der ein grafisches Spiel unter C++ programmiert erwarte ich auch, das dieser die C++ Grundlagen beherrscht. Wie wäre es wenn du dich erstmal mit C++ als solches, und anschließend mit der Spieleentwicklung beschäftigst (Ein weiteres Thema: wenn nichts dagegen spricht würde ich mit std::string statt mit char[] arbeiten).

    cu André



  • [quote="asc"]

    Dr4xt3r schrieb:

    wenn nichts dagegen spricht würde ich mit std::string statt mit char[] arbeiten).

    Richtig. char[] provoziert einfach Probleme. Beonders bei Maps ist string m.E. unumgänglich.

    mfg, Hans



  • [quote="asc]

    Sorry, aber von jemanden der ein grafisches Spiel unter C++ programmiert erwarte ich auch, das dieser die C++ Grundlagen beherrscht. Wie wäre es wenn du dich erstmal mit C++ als solches, und anschließend mit der Spieleentwicklung beschäftigst (Ein weiteres Thema: wenn nichts dagegen spricht würde ich mit std::string statt mit char[] arbeiten).

    cu André[/quote]

    Ja n kleiner Fehler also ich mach das mit Visual C++ da ich son Buch habe das Heisst : Spieleprogrammiereung mit DirectX und Visual C++ und da lernt man eigentlich zumal den Anfang von c++ also Funktionen , Klassen , Zeiger usw.
    und dann lernt man halt den Standard Einsatz von DirectX und geht nicht so tief in c++ ein also muss ich mir das fehlende halt so von Kollegen und im internet beschaffen. ^^



  • DirectX ist meiner Meinung nach halt eher für 3D geeignet. Allegro soll für 2D schon ganz gut sein (ich selbst hab aber noch keine Erfahrungen damit gemacht).
    Wenn du nicht viel zeit hast dann ist so ein Buch eigentlich genau des richtige aber am Ende sollte man sich dann schon mal in Std-C++ "aufskillen", einfach weil man damit einige Probleme sehr einfach lösen kann.
    Wenn man nur irgendwie 3D programmieren will eigenet sich m.E. GLUT mit OpenGL am besten, da mand damit Modelle schon mit ~15 Zeilen Code erstellen kann.

    mfg, Hans



  • Golem86 schrieb:

    DirectX ist meiner Meinung nach halt eher für 3D geeignet.

    DirectX ist genauso für 2D geeignet. 🙄



  • mir is da noch was aufgefallen als ich mir nämlich die .txt von Rome Total War angeschaut habe Da werden alle Sachen in Diesem Format aufgelistet :

    Name x y
    Name x y

    und mit getline allein muss man ja eig. zwangsweise auf das Format zurückgreifen:

    Name
    x
    y

    Name
    x
    y

    Also beim obigen Format wird die sache dann schon etwas komplizierter oder lässt sich das mit getline auch lösen



  • drakon schrieb:

    Golem86 schrieb:

    DirectX ist meiner Meinung nach halt eher für 3D geeignet.

    DirectX ist genauso für 2D geeignet. 🙄

    Aber möglicherweise zu schwierig für den Einstieg in die Spieleprogrammierung, gerade wenn man noch nicht einmal die C++-Grundlagen beherrscht...
    Ich rate für 2D-Spieleprogrammierung immer zu SFML, das finde ich wirklich genial. Allegro kenn ich jetzt nicht, ich hab jedoch schon häufig Schlechtes darüber gehört. Bei SFML ist sicher auch die Performance kein Problem. Mehr dazu gibts auch im Spiele-/Grafikprogrammierung-Forum, dort werden viele solcher Diskussionen geführt.

    Dr4xt3r schrieb:

    Also beim obigen Format wird die sache dann schon etwas komplizierter oder lässt sich das mit getline auch lösen

    Ja, es lässt sich auch mit der globalen Funktion std::getline() (nicht std::fstream::getline() , das ist für C-Strings) lösen. Am flexibelsten bist du wohl mit den std::string -Funktionen find() und substr .


Anmelden zum Antworten