[gelöst] Andere Methode wie system ("cls") ?



  • GELÖST!

    Hallo, ich wollte mal fragen, ob es eine andere Methode für system ("cls") (clear screen) gibt, das unter Win32-Konsolenanwendung funktionniert? Ich brauch das da system ("cls") anscheinend nur unter Windows läuft. Ich hab' da mal in Google reingeschaut jedoch nur system ("cls") gefunden.

    Kennt jemand eventuell eine andere Möglichkeit?

    MfG Spiri


  • Mod



  • __asm rep stosw
    

    oder so



  • Nun Leute, ich habe es endlich geschafft! Ich habe eine Lösung gefunden, um das system ("cls") zu umgehen. Ich habe mir jetzt erlaubt, ein kleines Tutorial für die andere Methode zu schreiben und würde mich auf eine Kritik freuen. Bevor ihr jedoch mit der Kritik beginnt möchte ich an diesem Punkt sagen, dass das mein aller erstes selbstgeschriebenes Tutorial ist, d.h. bitte nicht zu hart. Außerdem will ich mich im Tutorial für meine deutsche Grammatik entschuldigen (bin ja kein Deutscher).

    TUTORIAL: Andere Methode für system ("cls")

    Man benötigt die Präprozessor-Direktive <windows.h> sowie zwei Funktionen:

    `void clear_screen ()

    void cursor_pos (int x, int y)`

    Die clear_screen -Funktion benötigt man, um mittels Leerzeichen den bereits vorhandenen Text zu überschreiben. Das sieht dann so aus:

    void clear_screen ()
    {
    	for (int i=0; i<1000; i++)
    		cout << " ";
    }
    

    Doch wenn man nur diese Funktion im Programm aufruft, wird der Text nicht überschrieben, sondern es werden einfach nur so lange Leerzeichen aufgerufen, bis man das Programm so runtergescrollt hat, dass man den vorherigen Text nicht mehr sieht. Das funktioniert, ist aber nicht sehr schön, weil...

    1. Wenn man das Programm wieder raufscrollt sieht man wieder den vorherigen Text.
    2. Der nächste Text, der ausgegeben werden soll wird in die letzte Zeile des Programms ausgegeben.

    Nun wie kann man das ändern? Ganz einfach! Man codiert sich einfach eine Funktion, die die Cursorposition wieder auf 0x0y bringt. Wenn das getan ist und die Cursorposition wieder auf 0x0y ist, kann man mittels der clear_screen -Funktion den vorhandenen Text überschreiben.

    void cursor_pos (int x, int y)
    {
    	COORD c = {x, y};
    	SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
    }
    

    Natürlich sollte man nach der aufgerufenen clear_screen -Funktion wieder erneut die cursor_pos -Funktion aufrufen, um wieder bei Position 0x0y Text ausgeben zu können.

    Hier ein kleines Beispiel:

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    // functions
    //
    void clear_screen ();
    void cursor_pos (int x, int y);
    
    int main (void)
    {
    	// show first sentence
    	cout << "This is the first sentence!\n";
    	system ("pause");
    
    	// CLEAR SCREEN
    	cursor_pos (0, 0);
    	clear_screen ();
    	cursor_pos (0, 0);
    
    	// show second sentence
    	cout << "That's the second sentence!\n";
    	system ("pause");
    
    	return 0;
    }
    
    // function to clear screen
    //
    void clear_screen ()
    {
        for (int i=0; i<1000; i++)
            cout << " ";
    }
    
    // function to set cursor position
    //
    void cursor_pos (int x, int y)
    {
        COORD c = {x, y};
        SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
    }
    

  • Mod

    Und warum verwendest Du nciht die weituas schnellere Methode, die auch dokumentiert ist?
    http://support.microsoft.com/kb/99261

    Das ist übrigens der erste Link wen man die entsprechende Google Suche ausführt, die ich angegeben habe...



  • Martin Richter schrieb:

    Und warum verwendest Du nciht die weituas schnellere Methode, die auch dokumentiert ist?
    http://support.microsoft.com/kb/99261

    Ich finde, dass meine Version (für mich) besser verständlicher ist.
    Außerdem habe ich oft die Google-Suche benutzt, um eine andere Methode für system ("cls"); zu finden, jedoch wochenlang erfolglos. Doch, ich habe was gefunden, jedoch für mein Niveau etwas zu kompliziert. Wie der von Dir gepostete Link zB.


  • Mod

    Deine Methode funktioniert nicht zuverlässig.
    1. Verändert sie das stdout Deiner Anwendnung
    2. Funktioniert Deine Lösung nur, solange SpaltenZeilen<=1000 Zeichen.
    Bei einer normalen Console hat eine Console bereits 24
    80== 1920 Zeichen.
    Was, wenn Du eine COnsole mit 250 Spalten und 80 Zeilen hast?

    Aus diesen Gründen ist Deine Lösung nicht das, was man unter "Löschen der Consolen Anzeige" versteht.

    Für mich wäre Punkt 1 ein Killer, denn ich arbeite oftmit Umlenkung von Ausgaben.

    Just my 2 Cents!

    PS: Arbeite Dich in die Windows API ein, dann ist auch der Code aus dem KB Artikel verständlich 🕶


Anmelden zum Antworten