cout timer einstellen
-
Hallo Leute,
ich bin gerade dabei etwas schickes zu proggen und würde gerne mein cout (einfacher Text) nicht sofort, sondern mit verzögerungen zwischen den Buchstaben ausgeben. Ich wusste vor einigen Monaten wie man das gemacht hat, habs aber total vergessen.
H(1sek.) A(1sek) L(1sek.) L(1sek) O
weiß jmd zufällig noch wie man das eingibt ?

-
Sehr wahrscheinlich hast du das nicht so gemeint, aber das hier ist die universelle Lösung:
#include <iostream> #include <unistd.h> // oder was auch immer das Äquivalent auf Windows ist // der Syntaxhighlighter ist offensichtlich auch nicht perfekt struct delayed_streambuf : std::streambuf { delayed_streambuf(std::streambuf* buf) : buf(buf) {} protected: virtual int_type overflow(int_type c) { buf->sputc(c); buf->pubsync(); sleep(1); // oder was auch immer das Äquivalent auf Windows ist return c; } private: std::streambuf* buf; }; int main() { std::cout.rdbuf(new delayed_streambuf(std::cout.rdbuf())); std::cout << "Hello\n"; }
-
Unter Windows
#include <windows.h> Sleep(1000);
-
Hab auch noch eine Lösung. Find sie zwar irgendwie doof, poste sie aber trotzdem mal.
#include <iostream> #include <windows.h> std::ostream& delay( std::ostream& out ) { Sleep(1000); return out; } std::ostream& operator<<( std::ostream& out, char c ) { return std::operator<<(out,c) << delay; } int main() { std::cout << 'H' << 'A' << 'L' << 'L' << 'O'; }
-
danke leute
funzt perfekttttt
-
#include <string> #include <iostream> #include <Windows.h> std::ostream& PrintChar(std::ostream& out, char c) { std::operator<<(out, c);; Sleep(1000); return out; } std::ostream& operator<<(std::ostream& out, const char *c) { for (const char *ptr = c; *ptr; ++ptr) PrintChar(out, *ptr); return out; } std::ostream& operator<<(std::ostream& out, char c) { return PrintChar(out, c); } int main() { std::cout << "Hallo, Welt!" << '\n' << "Blub!"; }
-
Bisher hat keiner
std::this_thread::sleep_forerwähnt, was im Standard enthalten ist.#include <chrono> #include <ostream> #include <streambuf> #include <thread> template< typename CharT, typename Traits = std::char_traits<CharT>, typename InternalDuration = std::chrono::milliseconds > class DelayedStreamBuf : std::basic_streambuf<CharT, Traits> { public: typedef CharT char_type; typedef Traits traits_type; typedef typename traits_type::int_type int_type; typedef InternalDuration duration_type; private: std::basic_ostream<char_type, traits_type>& mOstream; std::basic_streambuf<CharT, Traits>* mOldBuf; duration_type mDelay; public: DelayedStreamBuf( std::basic_ostream<char_type, traits_type>& os, duration_type delay ): mOstream(os), mOldBuf{os.rdbuf(this)}, mDelay{delay} {} virtual int_type overflow( int_type c = traits_type::eof() ) { std::this_thread::sleep_for( mDelay ); auto rval = mOldBuf->sputc( traits_type::to_char_type(c) ); mOldBuf->pubsync(); // Edit: Eingefügt. s.u. return rval; } ~DelayedStreamBuf() { mOstream.rdbuf( mOldBuf ); } }; #include <iostream> int main() { DelayedStreamBuf<char> buf(std::cout, std::chrono::seconds{1}); std::cout << "Hallo!"; }@zufaellig: Dein Code ist AFAIK UB, da du den Streambuf nicht zurücksetzt.
buf->pubsync();Und wieso, darf man fragen, flushst du den Stream wo dich doch keiner gebeten hat?

-
Das ... gibts doch nicht! Ich hab sogar den selben Namen wie zufaellig!

Mir ist bis gerade eben nicht aufgefallen dass überhaupt jemand dasselbe gemacht hat
-
Sone schrieb:
@zufaellig: Dein Code ist AFAIK UB, da du den Streambuf nicht zurücksetzt.
Wieso UB? Dem Stream ist es egal, was für ein Streambuf drunter ist. Mein Code hat einen Memory Leak, aber das stört mich nicht.
Es ist ausserdem nicht die Aufgabe eines Streambuffers, den Stream zu managen, so wie deiner das tut. Wenn der Nutzer das will, soll er es tun, aber zwing ihn doch bitte nicht dazu.
Und wieso, darf man fragen, flushst du den Stream wo dich doch keiner gebeten hat?
Hast du deinen Code mal ausgeführt? Du gibst nach 5 Sekunden auf einmal "Hallo!" aus. Bei mir ist es 'H' -> 1sec Pause -> 'a' -> 1sec Pause -> ...
Ich hab sogar den selben Namen wie zufaellig!
Ja, aber völlig overengineered und mit obskuren Namen.
-
zufaellig schrieb:
Sone schrieb:
@zufaellig: Dein Code ist AFAIK UB, da du den Streambuf nicht zurücksetzt.
Wieso UB? Dem Stream ist es egal, was für ein Streambuf drunter ist. Mein Code hat einen Memory Leak, aber das stört mich nicht.
Ach, na dann ist ja alles gut

Und wieso, darf man fragen, flushst du den Stream wo dich doch keiner gebeten hat?
Hast du deinen Code mal ausgeführt? Du gibst nach 5 Sekunden auf einmal "Hallo!" aus. Bei mir ist es 'H' -> 1sec Pause -> 'a' -> 1sec Pause -> ...
Oh! Nein, bei mir funktioniert es. Sry, hast natürlich Recht, das muss geflusht werden.
Kommt vielleicht davon, dass du unter Linux bist..?Ich hab sogar den selben Namen wie zufaellig!
Ja, aber völlig overengineered und mit obskuren Namen.
Nein, nur UpperCamelCase. Der Rest ist eigentlich ganz normal, nicht?