system("cls"); Alternativen



  • Kennt ihr schnellere Alternativen zu system("cls");



  • entweder über api oder steuerzeichen

    bin mir nun nicht ganz sicher aber ich glaube es war \x12[2J



  • Hi, prinzipell ist das eigentlich ganz einfach.

    Wiegesagt, es gibt API - Funktionen dafür, ich jetzt aber leider nicht da habe (Fremder PC).

    Eine gute Alternative dazu ist aber die Improved Console, dort gibt es eine Funktion namens 'clrscr'. Wenn du sie aber nicht jedesmal in dein Projekt einbinden möchtest, kopier dir einfach den entsprechenden Quelltext in dein Programm. Viel Spass ! 😉

    //Hab dir gleich mal den Code kopiert:

    void clear (Color color, TCHAR character)
    	{
    		clearColor(color);
    		clearText(character);
    	}
    

    Wie du die Funktion genau anwendest (welche Parameter du übergeben musst, siehst du hier:

    void clrscr (Color color = FG_WHITE | BG_BLACK, TCHAR character = TEXT(' ')) { con.clear(color,character); }
    

    MfG, mikey.



  • @Stelfer:
    Kannst du das mal für dumme (mich) näher erklären?
    Ein Stück Quelltext vielleicht.

    @mikey:
    Danke, aber kannst du mir sagen, ob das auch schneller ist?



  • Danke, aber kannst du mir sagen, ob das auch schneller ist?

    Schneller als System ?! Na aufjedenfall, das ist allgemein die gebräuchlichste Methode den Screen zu löschen. Den Bildschirm mit Steuerzeichen (Escapesequenzen) zu löschen, ist eine veraltete und schlechte Methode. Zumindest habe ich schon sehr viele Codes gesehen, und davon hat keiner diese Methode angewendet 😉

    API - Aufrufe ----> Im Normalfall der Standard, und schnell nochdazu!
    Fazit: Verwende die oben genannten API Aufrufe.

    Achja, und die E-Sequenz zum löschen des Bildschirms lautet so:

    std::cerr << "\033[2J";
    

    MfG Mikey.



  • @mikey:

    Den Bildschirm mit Steuerzeichen (Escapesequenzen) zu löschen, ist eine veraltete und schlechte Methode.

    Wieso veraltet und schlecht? Ist sicher auch nicht bzw. nicht ernsthaft langsamer als mittels API Befehlen...
    Vor allem verstehe ich nicht wieso es "schlecht" sein soll, kannst du dafür Gründe nennen oder einfach bloss schlecht weil du es nicht magst?



  • Deswegen:

    Heutzutage rate ich von Esacpesequenzen ab, da sie auf den meisten Systemen, wie bereits gesagt, nicht mehr funktionieren und es wesentlich komfortablere Möglichkeiten gibt die Konsole zu steuern (zB mit der Improved Console).

    Und deswegen auch noch:

    Man beachte auch, dass trotz des ANSI-Treibers keine dieser Funktionen kompatibel zum Sprachstandard von C oder C++ ist!

    Klar sind die Gründe nicht totschlagend, aber es gibt wirklich bessere Alternativen, als den Bildschirm mit Escapesequenzen zu löschen. Wenn ich was sage, dann hat das in meinen Augen auch einen Sinn 🙂

    //Edit: Na okay, vielleicht war meine Kritik etwas zu krass, aber dennoch sollte es nicht zur Gewohnheit werden.

    Míkey.



  • mikey schrieb:

    Heutzutage rate ich von Esacpesequenzen ab, da sie auf den meisten Systemen, wie bereits gesagt, nicht mehr funktionieren und es wesentlich komfortablere Möglichkeiten gibt die Konsole zu steuern (zB mit der Improved Console).

    Was heißt "die meisten Systeme"?
    Soweit ich das beurteilen kann benutzt man vor allem in Unices Konsolen, bzw. Terminalemulationen, und die beherrschen Escapesequenzen (das Programm clear ist z.B. sehr oft (mindestens bei GNU/Linux und Mac OS 😵 einfach über Ausgabe der entsprechenden Sequenz nach stdout implementiert).

    Aber da wohl Windows gemeint ist, hast du dennoch Recht. Nur das "schlecht" stimmt so nicht.



  • Sorry, das ich erst jetzt wieder etwas schreibe, ich war auf einer Weihnachts-LAN.

    Ich bin zu blöd um zu verstehen was ihr da gerade diskutiert und ich verstehe auch eure Lösungen den Bildschirm zu löschen nicht.
    Könntet ihr mir nicht bitte ein Beispielprogramm zeigen, welches einfach irgendwas ausgibt und es dann wieder löscht.



  • HALLO?

    Kommt Leute, ihr habts ja schon erklärt, aber ich verstehe es nicht (bin zu blöd).
    Ich will doch nur ein winziges Beispielprogramm, um zu sehen, wo z.B. die Definition von Color steht.

    BITTE!



  • Schau mal in das Konsolen-Board, da gibt es einen recht umfangreichen Thread zum Thema Improved Console. (und im ersten Beitrag ist auch ein Link, wo du dir die nötigen Dateien holen kannst)





  • Ha jetzt auch eine Frage wie gehtn das?

    std::cerr << "\\x12[2J";
    

    War das mit den Steuerzeichen so gemeint? Das funzt bei mir nicht da wir bloß immer das Teil wie ein ganz normaler Text in die Konsole geschrieben.
    Und warum eigentlich cerr? Gestern hab ich gelernt:
    cout -> Ausgabestream-Objekt für normale Textausgaben.
    cerr -> Ausgabestream-Objekt für Fehlermeldungen.
    Da kann man doch auch ganz normal cout verwenden?
    Dankeschön schon mal im Voraus.



  • Erstens ist da ein \ zu viel drin. Zweitens hängt es stark von deinem System ab, ob solche Escapesequenzen noch irgendetwas ausrichten.

    (Ansonsten ist es egal, an wen du diese Sequenz schickst, aber bei cout ist die Chance idR höher, daß es in eine Datei umgeleitet wurde - und die versteht definitiv nichts von der Escape-Sequenz)



  • Ups mh ja ich habs bloß hier falsch geschrieben.

    cerr << "\x12[2J";
    

    Geht bei mir nicht, weder unter Windows oder unter Ubuntu. Mh na ja is aber auch nicht so wichtig jetzt. 🙂



  • Sorry, war auch grad den ganzen Tag weg ... 🙂

    Hier der Code:

    void clrscr()
    {   
        COORD coordScreen = { 0, 0 };    
        DWORD cCharsWritten;   
        CONSOLE_SCREEN_BUFFER_INFO csbi;   
        DWORD dwConSize;  
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
        GetConsoleScreenBufferInfo(hConsole, &csbi);   
        dwConSize = csbi.dwSize.X * csbi.dwSize.Y;     
        FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten);   
        GetConsoleScreenBufferInfo(hConsole, &csbi);   
        FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
        SetConsoleCursorPosition(hConsole, coordScreen);   
    }
    

    Vielleicht nicht die eleganteste Methode, aber das ist der einzige Code, den ich grad mal schnell da hatte (fremder PC). Allerdings ist diese Methode auch nicht die langsamste, trotzdem wesentlich schneller als system ("cls");

    Viel Glück noch,

    Mikey.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten