Konsole clear funktioniert nicht

Gast #5782331
Lesenswert?

Hallo,
ich möchte ein Konsolen-Programm erstellen. Dazu möchte ich auch die 
Funktion benutzen, dass die Konsole gelöscht wird und neu bescrieben 
wird. Aber das funktioniert bei mir nicht wirklich (Windows10; Cygwin 
GCC)
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4

5
static void clearScreen(void);
6

7
int main(void) {
8
  while(1)
9
  {
10
    clearScreen();
11
    printf("r: run; t: train; q: quit\r\n\r\n");
12
  }
13
  return EXIT_SUCCESS;
14
}
15

16
void clearScreen(void)
17
{
18
#if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
19
    system("clear");
20
#endif
21

22
#if defined(_WIN32) || defined(_WIN64)
23
    system("cls");
24
#endif

Momentan bin ich nur dabei, diese Funktion zu testen. Daher ist mein 
Programm noch ziemlich leer.
Aber die Konsole wird nicht gelöscht und immer neu unter der alten 
ausgabe geschrieben.
Aber alles was ich immer gefunden habe, war system("cls"). Gibt es noch 
andere möglichkeiten? Oder woran könnte es liegen, dass es bei mir nicht 
funktioniert?
Gast #5782361
Lesenswert?

So sollte es funktionieren. Aber auch das ist zu schnell.
1
while(1){
2
     clearScreen();
3
     printf("r: run; t: train; q: quit\r\n\r\n");
4
     fflush(stdout);
5
}

Mit Pause:
1
while(1){
2
     clearScreen();
3
     printf("r: run; t: train; q: quit\r\n\r\n");
4
     fflush(stdout);
5
     getchar();
6
}

Jens schrieb:
> aber auch ohne der schleife wird der Text nicht gelöscht.

Welcher Text wird nicht gelöscht? Unter Linux wird alles gelöscht.
Persönliche Seite #5782377
Lesenswert?

Jens schrieb:
> Aber alles was ich immer gefunden habe, war system("cls").

Die Konsole kann unter Windows mit einer ganzen Reihe von Funktionen aus 
der Win32-API angesteuert werden.

https://docs.microsoft.com/en-us/windows/console/console-functions

Diese Funktionen sind allerdings recht "low-level", wie auch das zweite 
Beispiel hier zeigt:

https://docs.microsoft.com/en-us/windows/console/clearing-the-screen
Gast #5782379
Lesenswert?

zitter_ned_aso schrieb:
> Welcher Text wird nicht gelöscht?

r: run; t: train; q: quit\r\n\r\n

zitter_ned_aso schrieb:
> Unter Linux wird alles gelöscht.

Bein mir unter Windows aber nicht

zitter_ned_aso schrieb:
> while(1){
>      clearScreen();
>      printf("r: run; t: train; q: quit\r\n\r\n");
>      fflush(stdout);
>      getchar();
> }

Auch das bringt nichts.

foobar schrieb:
> void clearScreen(void)
> {
>     printf("\e[H\e2J");
>     fflush(stdout);
> }

Das springt zwar wieder zur ersten Zeile und überschreibt das 
vorhandene, löscht aber nicht den bisherigen Inhalt der Konsole
Gast #5782415
Lesenswert?

>> void clearScreen(void)
>> {
>>     printf("\e[H\e2J");
>>     fflush(stdout);
>> }
>
> Das springt zwar wieder zur ersten Zeile und überschreibt das
> vorhandene, löscht aber nicht den bisherigen Inhalt der Konsole

Upps, sorry.  Da fehlt ein [ vor dem 2J: "\e[H\e[2J"

"\e[H" ist Cursor-Home, "\e[2J" ist Clear-Screen.

Btw, mit printf("\e[%d;%dH", zeile, spalte) kannst du den Cursor 
positionieren.  Siehe: https://en.wikipedia.org/wiki/ANSI_escape_code
Gast #5782662
Lesenswert?

zitter_ned_aso schrieb:
> Moment mal, du schreibst doch selbst diesen Text.
>
>  Zuerst löscht du das Ausgabefenster und dann schreibst du diesen Text.

Ja, durch die schleife, soll der geschriebene Text aber wieder gelöscht 
werden und neu gescrieben werden. Der Text soll dann immer an der selben 
stelle geschrieben werden. Daher möchte ich das Fenster löschen und neu 
beschreiben. Wenn das funktioniert, werden später noch weitere daten 
dargestellt, die sich dann auch ändern.

foobar schrieb:
> "\e[H" ist Cursor-Home, "\e[2J" ist Clear-Screen.

Das sieht besser aus.
Aber gelöscht wird der Inhalt ja auch nicht,sondern nur nach oben 
verschoben. Wenn ich es öfters ausführe, kann ich scrollbalken nach oben 
schieben und sehe den alten text
(Firma: https://img.favpng.com/23/21/3) #5782669
Lesenswert?

ist so ein typisches C Problem..
"However, there is no Win32 Application Programming Interface (API) or 
C-Runtime function that will perform this function."

Ich hatte dazu mal irgendwo eine Lösung gefunden..sind nur etwa 20 
Zeilen.damit es funktioniert...
https://support.microsoft.com/de-de/help/99261/how-to-performing-clear-screen-cls-in-a-console-application

kannst ja auch mal das testen
https://cboard.cprogramming.com/c-programming/23780-how-do-i-clear-screen-c-program.html


Ich glaube das ght dann aber wiede nur unter Windows, ins Linux klappt 
das dann auch wieder nicht..
In Pascal wäre der Befeh übrigens einfach clrscr;
(Firma: https://img.favpng.com/23/21/3) #5782670
Lesenswert?

so sieht clrscr im Source aus in Pascal, es werden offenbar wie bei dem 
Microsoft Beispiel für C lediglich Leerzeichen geschrieben, allerdings 
ist mir dabei nie aufgefallen das ich das ältere noch sehen konnte.
1
procedure ClrScr;
2
var
3
  DestCoor: TCoord;
4
  numChars, x : DWord;
5
begin
6
  DestCoor.X := WindMinX - 1;
7
  DestCoor.Y := WindMinY - 1;
8
  numChars := (WindMaxX - WindMinX + 1);
9

10
  repeat
11
    FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TextAttr,
12
      numChars, DestCoor, x);
13
    FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), #32,
14
      numChars, DestCoor, x);
15
    inc(DestCoor.Y);
16
  until DWord(DestCoor.Y)=WindMaxY;
17

18
  GotoXY(1, 1);
19
end; { proc. ClrScr }
Gast #5782673
Lesenswert?

Thomas M. schrieb:
> ist so ein typisches C Problem..
> "However, there is no Win32 Application Programming Interface (API) or
> C-Runtime function that will perform this function."

Nur weil der Compilerhersteller nix bequemes für diesen Teil der API 
mitliefert? Es wird immer irgendwas fehlen.

Kann man dann einfach selbst machen, die Windows API ist gut 
dokumentiert und Funktionen aus DLL aufrufen geht auch unter C.

> Ich glaube das ght dann aber wiede nur unter Windows, ins Linux klappt das dann 
auch wieder nicht..

Klar, Linux hat ne andere API als Windows. Aber auch unter Linux wird 
das System entsprechende Funktionen bereitstellen.
Wobei es unter Linux garantiert ne fertigte lib dafür gibt (ncurses ?).
Gast #5782679
Lesenswert?

Naja, Neueinsteiger programmieren heutzutage eher selten GUI in Konsole 
;-)

Wenn dann nutzt man eher Konsolenprogramme die kontinuierlich etwas auf 
der Konsole ausgeben.

Früher war GUI bei DOS Programmen üblich, aber das war ja nicht per 
Konsole.
(Firma: https://img.favpng.com/23/21/3) #5782680
Lesenswert?

Also, ein Hallo world in dder Konsole finde ich nicht so selten..
Die ersten Schritte erfolgen denke ich sehr oft in der Console..
mit welchem Befehl kann man in C  alles hinter der aktuellen Ausgabe 
löschen ohne das aktuelle neu geschriebene zu löschen?
Vermutlich muss man dazu dann die eben genannten Beispiele umschreiben..
#5782684
Lesenswert?

Thomas M. schrieb:
> ich denke aber clrscr...ist so etwa grundlegendes wie delay..das es mal
> als Standard dazugepackt werden sollte..das Problem haben ja alle
> Neueinsteiger

clrscr ist nicht nötig.
Das sollten Neueinsteiger schnell lernen.

Genauso wie Umlaute in der Konsole.
Ist zwar hübsch, aber überflüssig zum lernen.

Ein TUI werden sie erstmal nicht nutzen.
(Firma: https://img.favpng.com/23/21/3) #5782696
Lesenswert?

Wieso ist clrscr überflüssig?
Auch umlaute sind nicht unwichtig..
Schon mal gehört, das man am besten lernt wenn etwas Spaß macht?
Umlaute und das Benutzen der Cursortasten sind wohl die beliebtesten 
Dinge als Anfänger um Anständige Sätze bilden zu können und nicht nie
Wie löscht Du denn dann den Bildschirm..sorry aber sowas höre ich das 
erste mal..
Einfache eingaben Wie
Wie lautete Dein Vorname
Wie lautet Dein Nachname
ClrScr;
Hallo Mr.X oder darf ich y sagen?

Udn auch Delays können sinnvoll eingesetzt werden..oder willst Du 
ernsthaft bei einem 5 Zeile Programm einen Counter einsetzten?
Abgesehen davon finde ich sollte der Programmierer selber entshcheiden, 
was man tut und was nicht..wenn man es mit einem neuen Bildschirm 
schreiben möchte..möchte ich mir nicht sagen lassen, das macht man 
nicht.
Daher haben wir heutzutage diese unsäglichen Webseiten im OnePAge 
Design*kotz*

Damals...wurde den Anfänger die sowas gemacht haben, gesagt..sowas macht 
man nicht...heute wären es voll die Trendsetter....oder die Profil 
Webdesigner von heute sind eigentlich eher die totalen Anfänger geworden
Gast #5782704
Lesenswert?

Dirk B. schrieb:
> test schrieb:
> BTW: Sollte eigentlich möglich sein direkt in den Konsolenbuffer zu
> schreiben, oder? Dann ist löschen überflüssig und man kann seinen Kram
> genauso machen wie früher bei den DOS Programmen.
>
> Dann bist du an ein System gebunden.
> Wozu dann C?

Man ist immer an ein System gebunden. Es sei den das Programm ist sehr 
einfach (im Bezug auf die Systemintegration) oder Müll.

Mit C hat das aber nix zu tun, man kann in jeder Sprache 
plattformübergreifend oder plattformspezifisch schreiben.

Aber gerade wenn es um GUI geht kommt man mit irgendwelchen C Standards 
oder POSIX nicht weiter. Die Systeme unterscheiden sich hier so extrem 
das für jedes System individuell entwickelt werden muss. Oder man 
bekommt Müll.
(Firma: https://img.favpng.com/23/21/3) #5782709
Lesenswert?

ernstgemeinte Frage..und soll jettz nicht dem Pascal vs. C Streit 
dienen.
Wenn jemand nach clrscr fragt, kommt IMMER zuerst die Escape sequenz von 
jemandem..was damals zu Dos Zeiten evtl ok gewesen wäre...oder eben auch 
nicht..denn..

Wenn ich heute im Dos Fenster ein Pascal Programm laufen lasse, läuft 
das ja ohne Probleme, außer es wird der Runtime Error 200 nicht 
geptacht.

Wenn nun aber jemand, was ja offensichtlich seeehr viele gemacht 
haben..in ihren C Programmen einfach die Escape Sequenz genutzt haben 
für clrscr..
Laufen dann all diese Programme heute nicht mehr?
Gibt es für sowas auch einen Patch?
Oder war die verwendung der Escape Sequenz schon damals ungeschickt bzw 
falsch?!

Ich habe jetzt leider kein einfache C Programm hier, mit dem ich das 
selber testen könnte

ICh lade mir gleich mal Turbo C runter um das mal zu versuchen:-)
Gast #5782720
Lesenswert?

Man muss erstmal generell zwischen einem DOS Programm und einem Windows 
Konsolenprogramm unterscheiden.

Sieht beides erstmal gleich aus, unterscheidet sich aber grundsätzlich.


Ein Windows Konsolenprogramm hat kein Fenster, aber es öffnet eine 
Konsole (diese Konsole ist aber kein DOS was dort aufgeht, und auch 
keine Windows Kommandozeile). Diese Konsole ist erstmal nix anderes als 
ne Textbox.
(Firma: https://img.favpng.com/23/21/3) #5782727
Lesenswert?

geht ncurses denn auch unter Dos? nein...dazu nutzt man conio.h
https://de.wikipedia.org/wiki/Ncurses
"Betriebssystem   Unix-Derivate, GNU/Linux"

https://en.wikipedia.org/wiki/Conio.h
conio.h is a C header file used mostly by MS-DOS compilers to provide 
console input/output.[1] It is not part of the C standard library or ISO 
C, nor is it defined by POSIX.



in der Conio.h. gibt es dann auch
clrscr!
(Firma: https://img.favpng.com/23/21/3) #5782740
Lesenswert?

ja eben es ist die Windows Konsole....nur da weiter oben der Einwand 
kam..Konsole Dos Fenster etc...
Jedenfalls mit PAscal geht alles noch ob nun im Dos Fenster oder in 
eienr Windows Konsole, egal ob Windows 3.0 oder Windows 10...

Offenbar ist es also geschickter es mit dem oben genannten C code zu 
lösen, der wie clrscr in Pascal/Freepascal einfach mit Blank Zeichen den 
Bildschirm füllt..als mit irgendwechen Esc Sequenzen oder sowas 
rumzuspielen, das das 2 Jahre funktioniert und bei nächsten 
Betriebsssytem nur noch fehlerhaft arbeitet
Moderator #5782755
Lesenswert?

Thomas M. schrieb:
> ich denke aber clrscr...ist so etwa grundlegendes wie delay..das es mal
> als Standard dazugepackt werden sollte..das Problem haben ja alle
> Neueinsteiger

Wenn alles, was irgendjemand als etwas Grundlegendes ansieht, in die
Standardbibliothek gepackt würde, würde diese sehr schnell riesengroß
werden. Das ist an sich kein Problem, denn in Free Pascal, Python und
einigen anderen Sprachen wird es ja mit Erfolg so gemacht.

Es ist aber die Philosophie von C, sowohl den Sprachumfang also auch die
Standardbibliothek möglichst schlank zu halten. Zudem versucht C, von
möglichst wenigen Annahmen zur Zielplattform auszugehen. ClrScr und
GotoXY bspw. setzen einen Bildschirm als stdout-Medium voraus. stdout
kann aber genauso gut ein Drucker, eine Datei, eine Pipe oder eine
Netzwerkverbindung sein, wo diese Funktionen wenig Sinn haben. Also
beschloss man, dass stdout einfach ein abstrakter Datenstrom ist, über
den sequentiell Zeichen oder Datenbytes übertragen werden, mehr nicht.

Diese Philosophie ist zum einen traditionell begründet, zum anderen aber
auch darin, dass C im Gegensatz zu Free Pascal und Python von der ISO
genormt ist. Je umfangreicher eine Sprache und ihre Standardbibliothek
ist, umso aufwendiger und schwieriger ist auch die Pflege der Norm (bei
C++ scheint man diesbezüglich derzeit die Grenzen ausloten zu wollen
;-)).

Auch in Free Pascal sind ClrScr und GotoXY – anders als die reinen
Stream-Funktionen Read und Write – nicht in der Default-Bibliothek
enthalten, sondern wurden in die Crt-Bibliothek ausgelagert. Der
Unterschied zu C liegt darin, dass bei Free Pascal die Crt-Bibliothek
gleich mitgeliefert wird, bei C muss man sie (bspw. in Form von ncurses)
nachinstallieren. Das ist zum einen lästig, zum anderen bestehen für
eine externe, auf eine bestimmte Anwendung (hier: Bildschirmausgaben)
spezialisierte Bibliothek kaum Beschränkunge bzgl. ihres Umfangs, so
dass ncurses eine Vielzahl von High-Level-TUI-Funktionen (Wie bspw.
Fenster) implementiert, die Crt nicht hat.
Persönliche Seite #5782768
Lesenswert?

Thomas M. schrieb:
> in ihren C Programmen einfach die Escape Sequenz genutzt haben für
> clrscr..
> Laufen dann all diese Programme heute nicht mehr?

Unter DOS funktionierte diese Esc-Sequenz auch nur, wenn der 
Speicherfresser ANSI.SYS geladen war.

In Windows 10, "Anniversary Edition", wurde diese Funktionalität 
erstmalig für alle Konsolanwendungen eingebaut.

Um sie nutzen zu können, muss die Win32-API Funktion SetConsoleMode mit 
dem Flag ENABLE_VIRTUAL_TERMINAL_PROCESSING aufgerufen werden.

Eine detaillierte Beschreibung der verschiedenen nutzbaren Esc-Sequenzen 
findet sich hier:

https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

(Vermutlich war irgendein Entwickler bei MS es leid, die arg grindige 
Win32-Console-API zu nutzen ...)
Beitrag #5782800 wurde von einem Moderator gelöscht.
(Firma: https://img.favpng.com/23/21/3) #5782801
Lesenswert?

?!
Was sollte es denn Deiner Meinung nach tun?!
Die Unit crt in Pascal/Freepascal nutze ich auch eher selten im 
embedded...aber sie ist halt dabei und könnte für z.B. delay genutzt 
werden
Wenn es in einer extra Lib ist, die aber mitgeliefert wird, wie eben bei 
Pascal..dann nutzt Du sie einfach nicht. verstehe Deine Frage jetzt 
nicht
Gast #5782815
Lesenswert?

Was macht man wenn man per ssh auf der Console ist? yalu hatt das 
Problem schon schön zusammengefasst.

Plattformübergreifend verzichtet man besser auf solche Spielereien. 
Sonst wirds sehr sehr mühselig (man kann sicher auf allen Systemen 
irgendwie rausfinden ob eine Konsole lokal ist und welche Fähigkeiten 
sie hat).
Persönliche Seite #5782823
Lesenswert?

Thomas M. schrieb:
> Somit könnte C einfach mehr der standard libs zugepackt werden, die es
> gerade für Anfänger nervig machen

Da C nicht dafür gedacht ist, die Probleme von Anfängern zu lösen, und 
das Problem irgendwelcher Bildschirmmanipulationen die wenigsten 
Entwickler von Konsolapplikationen überhaupt interessiert, dürfte sich 
hier ein Zielkonflikt auftun.
Moderator #5782828
Lesenswert?

Thomas M. schrieb:
> Wenn jemand nach clrscr fragt, kommt IMMER zuerst die Escape sequenz von
> jemandem..was damals zu Dos Zeiten evtl ok gewesen wäre...oder eben auch
> nicht..denn..

Unter unixoiden Betriebssystemen waren und sind die ANSI-Sequenzen
einfach Standard, weil sie nicht nur lokal, sondern auch auf externen
Bildschirmterminals und über zeichenbasierte Remoteverbindungen wie
Telnet und SSH funktionieren.

Auch in DOS und früheren Windows-Versionen wurden die ANSI-Sequenzen
unterstützt, dann wurden sie abgeschafft, um sie mit Windows 10 wieder
auferstehen zu lassen.

Übrigens verwendet Free Pascal unter Linux – der Unix-Tradition folgend
– für ClrScr, GotoXY usw. ebenfalls die ANSI-Sequenzen. Das Löschen der
Konsole übernimmt dabei der jeweilige Terminalemulator, was effizienter
und bei Remoteverbindungen Traffic sparender als die Ausgabe von
tausenden von Leerzeichen ist.

Thomas M. schrieb:
> Na fast richtig.
> In CRT Unit gibt es ja auch Windows und mehr
> http://wiki.freepascal.org/Crt/de#Window

Die Crt-Fenster sind keine echten Fenster im Sinne eines UI, sondern
lediglich eine Begrenzung der Textausgabe auf eine Teil des Bildschirms.
Die ncurses-Fenster hingegen erlauben Öffnen, Schließen, Stapeln, Ändern
der Größe, Verschieben dekorieren mit Rahmen u.ä., Menüs u.v.m., ganz
wie in einem GUI-Framework, nur dass das Ganze eben textbasiert ist.

Und weil die Darstellung der Fenster komplett auf ANSI-Sequenzen
aufbaut, funktioniert das alles auch über SSH.
(Firma: https://img.favpng.com/23/21/3) #5782854
Lesenswert?

"Da C nicht dafür gedacht ist, die Probleme von Anfängern zu lösen"
?!
Aha..C ist wieder was für Vollprofis wie sie hier in diesem Forum sind 
oder was willst Du damit sagen?!#
Fidnest Du nciht das die Diskussion bislang ausgesprochen friedlich 
war...;-)#

Es geht nicht darum ob einen Konsolenoperationen interessieren!! Die 
interessieren auch in Pascal keinen!
Es geht um Programme im Textmodus!!
Heutzutage  werden die aber üblich im Windows getestet..und da gibt es 
nun in C plötzlich >Probleme wenn man mit der ESC Sequenz arbeitet..
Wieso werden hier immer die Fakten völlig verdreht?



Ah ok, ncurses scheint jedenfalls sehr umfangreich zu sein..wie in 
Pascal die Window Unit oder wie die genau heißt.


aber wie dem auch sei..offenbar liegt das einzige Problem dabei, das 
eigentlich nur eine delay.h bei C zugelegt werden könnte.
Somit können wir uns den Hahnenkampf um C vs. Pascal ja auch sparen.
Wenn man durch die Foren surft, fällt halt eben nur gerade dieses clrscr 
und delay Problem auf..ist also halt absolut nicht selten.
In anderen Sprachen wie D ist es die disp.h ..aber der Definition von 
Rufus ist die Programmiersprache dann ja eine Anfängersprache, da sie 
offenbar zumindest Rücksicht auf "Anfängerprobleme" nimmt;-)
Wobei ich mich damit gerade weit aus dem Fenster lehne, da ich keine 
Ahnung habe, ob die zur Standardlieferung von D gehört;-) Ich 
unterstelle das jetzt einfach mal um eine Spitze an Rufus ...
#5783006
Lesenswert?

Thomas M. schrieb:
> ?!
> Was sollte es denn Deiner Meinung nach tun?!

Das frage ich ja dich, du willst ja, dass clrscr() Teil des Standards 
wird! Teil des Standards wird aber nur, wofür es auf möglichst alles 
Plattformen eine sinnvolle Umsetzung gibt.

Thomas M. schrieb:
> Wenn es in einer extra Lib ist, die aber mitgeliefert wird, wie eben bei
> Pascal..dann nutzt Du sie einfach nicht.

Dann ist es aber eben nicht Teil des Standards. Unter Windows gibt's 
eben die conio.h mit diversen Konsolen-Funktionen. Unter Linux findest 
du erase() in curses.h. Dein "Problem" ist also keines.

Thomas M. schrieb:
> Heutzutage  werden die aber üblich im Windows getestet..und da gibt es
> nun in C plötzlich >Probleme wenn man mit der ESC Sequenz arbeitet..
> Wieso werden hier immer die Fakten völlig verdreht?

Was kann nun C dafür, dass Windows sein Verhalten ändert.

Thomas M. schrieb:
> Somit können wir uns den Hahnenkampf um C vs. Pascal ja auch sparen.

Warum fängst du ihn dann an?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren