endl ohne Zeilenumbruch
-
Hallo liebe Community

Ich brauche für die Ausführung meines Programms endl, denn ohne funktioniert es nicht.
Problem:
endl erzeugt einen Zeilenumbruch was den Text nicht normal erscheinen lässt, sondern ihn vertikal ausgibt, was er nicht soll.Hier mein Code:
char example [] = "Hallo du da !"; for ( int i = 0; i < 13; i++ ) { cout << example[ i ] << endl; sleep(200); }Schon mal ein Danke an Euch !

-
std::endl flusht den Stream, also löst std::cout.flush() dein nicht näher spezifiziertes Problem vielleicht.
-
Hallo,
anstatt zu beschreiben, dass du endl brauchst, aber irgendwie doch nicht, weil es irgendwas tut, was du nicht willst, hättest du beschreiben sollen, was du erreichen willst. Vermutlich solltest du endl durch flush ersetzen, aber das ist nur geraten.
-
cout wie printf geben Text aus, wenn ein Zeilenumbruch drin ist. Das ist wie ein impliziertes Flush - da die Ausgabe gebuffert ist.
cerr wie fprintf(stderr,...) geben Text sofort aus, auch wenn kein Zeilenumbruch drin ist. Die Ausgabe ist ungebuffert.
-
Ok, ich versuche es noch genauer zu beschreiben

Also ich möchte gerne eine Ausgabe auf dem Bildschirm erzeugen, die eben nicht einfach so erscheint (also sofort da ist wie üblich), sondern wo man sieht wie es geschrieben wird, also Zeichen für Zeichen.
Dafür gebe ich den String per for-Schleife aus und mache nach jedem ausführen der for-Schleife ein sleep().
Soweit so gut, aber nun erscheint der Text nicht so:
"Hallo du da !", sondern so:
H
a
l
l
od
ud
a!
Ich habe mich da ein wenig schlau gemacht und herausgefunde, dass es an dem endl liegt, endl also einen Zeilenumbruch auslöst und da es ja bei jedem Schleifendurchlauf benutzt wird (siehe Code oben) kommt eben diese vertikale Ausgabe.
Wenn ich aber nun stattdessen endl weglasse wird der Text garnicht ausgegeben, weil der Puffer nicht geleert wird.
Nochmal zusammenfassend:
Ich möchte den String "Hallo du da !" ausgeben Zeichen für Zeichen und nicht das er vertikal untereinander Zeichen für Zeichen ausgegeben wird.Ich hoffe es ist dieses Mal ausführlich genug beschrieben. Wenn nicht schreibts in die Kommentare.
-----------------
MfG Train
-
Und man hat dir bereits gesagt, dass man mit
std::cout.flush()genau das erzwingen kann.#include <iostream> /*Ist nicht C++, aber das kümmert dich ja auch nicht ...*/ #include <unistd.h> int main() { char string[] = "Hallo, du da!"; for(size_t x = 0;x < sizeof(string) - 1;x++) { std::cout << string[x]; std::cout.flush(); sleep(1); } std::cout << "\n"; return 0; }EDIT:
coutalscount, neuer Einer ...
-
Man kann flush auch wie endl benutzen:
char example [] = "Hallo du da !"; for ( int i = 0; i < 13; i++ ) { cout << example[ i ] << flush; sleep(200); }
-
#include <iostream> // cin, cout #include <windows.h> // Sleep using namespace std; int main() { const char str[] = "Hallo du da !"; int i=0; while (str[i] != '\0') { cout << str[i] << flush; Sleep(200); i++; } }... oder in C++ 11:
#include <iostream> // cin, cout #include <chrono> // milliseconds #include <thread> // this_thread::sleep_for using namespace std; int main() { const char str[] = "Hallo du da! Kennst Du schon C++ 11?"; int i = 0; while (str[i] != '\0') { cout << str[i] << flush; this_thread::sleep_for(chrono::milliseconds(200)); ++i; } cout << endl << endl; }
-
Bitte nicht
char example [] = "Hallo du da !";. Lieber so:
const char *example = "Hallo du da !";Ist sicherer (da const) und möglicherweise schneller (da keine Kopie von einem String im Read-Only-Memory angelegt werden muss).
-
Danke für Eure Hilfen, aber weder das Eine noch das Andere funktioniert.
Wenn ich flush benutze auf alle erdenklichen Weisen die ihr mir gegeben habt kommt die Ausgabe, die auch kommt wenn ich endl einfach nur weg lasse.
Das mit C++11 habe ich auch schon ausprobiert und vor dem Beitrag überlegt, nur leider stehen mir diese files nicht zur Verfügung.
MfG Train
-
Code Blocks?
-
Wir benötigen klare Fehlermeldungen. C++ 11 klappt nur mit neueren Compilern, z.B. MS VS 2015 Community (kostenlos). Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.
-
Ich verwende Open Watcom IDE
MfG Train
-
Was exotischeres hättest du dir nicht aussuchen können, oder?
-
Erhard Henkes schrieb:
Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.
Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.
-
SeppJ schrieb:
Erhard Henkes schrieb:
Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.
Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.
Ist die Konsole von Eclipse nicht noch merkwürdiger?
@Train
Existiert das PRoblem auch, wenn du das Programm in der Standardkonsole (bei Windows cmd) vom System ausführst?
-
Ich habe das C++ 11 "sleep" in eine Funktion gepackt, damit das im Sourcecode nicht so schrecklich hässlich wirkt, und wegen des C++ Subforums string aus C++ verwendet:

#include <iostream> // cin, cout #include <chrono> // milliseconds #include <thread> // this_thread::sleep_for #include <string> using namespace std; void sleep(long long int ms) { this_thread::sleep_for(chrono::milliseconds(ms)); } int main() { const string str = "Hallo du da! Kennst Du schon C++ 11?"; int i = 0; while (str[i] != '\0') { cout << str[i] << flush; sleep(200); ++i; } cout << endl << endl; }
-
@DirkB Ja es treten exakt die selben Probleme auf, wie beim ausführen mit Watcom
@Erhard Henkes ich habe die sleep() Methode nach Vorlage selber geschrieben, da mir diese files nicht zur Verfügung stehen.
#include <time.h> void sleep(unsigned int mseconds) { clock_t goal = mseconds + clock(); while (goal > clock()); }MfG Train
-
Vielleicht haste die delay() in der <dos.h>
-
DirkB schrieb:
SeppJ schrieb:
Erhard Henkes schrieb:
Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.
Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.
Ist die Konsole von Eclipse nicht noch merkwürdiger?
Ich glaube, ich habe die beiden durcheinander geworfen. Eclipse hatte die Konsole mit dem merkwürdigen Verhalten.
@Train
Existiert das PRoblem auch, wenn du das Programm in der Standardkonsole (bei Windows cmd) vom System ausführst?Train schrieb:
@DirkB Ja es treten exakt die selben Probleme auf, wie beim ausführen mit Watcom
Das ist dann aber definitiv merkwürdig. Ich hege aufgrund deiner anderen Beschreibungen den Verdacht, dass du unsere Codes nicht 1:1 übernommen hast beziehungsweise uns nicht 1:1 den Code gezeigt hast, den du benutzt. Und in den Teilen, die du uns nicht zeigst, steckt der Fehler. So erfahren wir ja beispielsweise erst jetzt auf Seite 3, dass du die ganze Zeit über eine eigene sleep-Implementierung benutzt hast.