Frage an C++ Programmierer



  • Wie kann ich einen Wert in einer Zeile ändern, ohne die gesamte Zeile zu wiederholen? Angenommen ich habe ein Programm geschrieben, dass folgendes ausgibt:

    cout << "Das Programm wird in 10 Sekunden geschlossen." << endl;
    

    Dabei soll eine Rückwärtsschleife so eingebaut werden, dass der Text NICHT wiederholt wird, sondern nur die Sekunden dekrementiert werden. Also 9, 8, 7...

    Wie ist das realisierbar?

    Gruß, skully.


  • Mod

    Du brauchst irgendwas, dass deinem Programm klarmacht, was eine Textterminal für ein Ausgabegerät ist und was man damit für tolle Sachen machen kann. Dazu bemühst du am besten das Betriebssytem, denn das ist ja gerade dazu da, sowas zu vermitteln. Unter POSIX Systemen kannst du dazu unter anderem die Bibliothek ncurses verwenden. Bei den von Microsoft gemachten Systemen kenne ich mich nicht so gut aus, da nimmt man glaube ich conio.h. Für andere Systeme habe ich keine Ahnung, aber die beiden genannten Bibliotheken sollten das meiste abdecken.

    Übrigens ist dein Threadtitel sehr schlecht gewählt. Weder sagt er was über dein Problem aus, noch braucht man für dein Problem einen erfahrenen Programmierer.



  • #include <iostream>
    #include <sstream>
    
    void clear ()
    {
    //.. leeren der Konsole, siehe: http://msdn.microsoft.com/en-us/library/ms682663%28VS.85%29.aspx
    }
    
    int main ()
    {
     for (int i = 10; i > 0; --i)
     {
      clear ();
      std::stringstream s;
      s << "Das Programm wird in "<< i <<" Sekunden geschlossen.";
      std::cout << s.str();
     }
    }
    

    Link für Windows. Das gibt dir zwar auch noch jedes mal den Text aus, aber ist sicher einfacher, als jetzt hinzugehen und den Cursoer manuell rumzuschieben und die Variable verändern zu gehen..



  • Warum der Umweg über Stringstreams?



  • Ich würde nicht gleich die ganze Konsole leer machen, sondern eher ein \r schicken, dann soviel Spaces wie der vorige String lang war, und dann nochmal den neuen String.
    Geht natürlich nur, wenn der alte String nicht länger war, als die Konsole breit ist. Also üblicherweise < 80 Zeichen. (Gleich lang ist auch schon doof, springt der Cursor auch schon in die nächste Zeile)


Anmelden zum Antworten