Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90

    [C++] Pulire schermo e mettere in pausa senza system()

    So che esistono una marea di threads sull'argomento ma alla fine consigliano tutti di utilizzare system("cls") e system("pause") o propongono strani codici.

    Che ne dite, si può fare senza (anche tramite link alle API)?

  2. #2
    Se il tuo emulatore di terminale è basato su vt100 e lo permette potresti usare la sequenza di escape
    ESC[2J

    Per pulire lo schermo, prova così:
    codice:
    #include <stdio.h>
    
    int main()
    {
    	printf("%c[2J", 27); //27 == ESC
    }
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Non è che deve funzionare solo sul mio pc, è un programma che raccoglie un po' di cose utili che devo dare a varie persone...

  4. #4
    Eh, boh, vt100 è usato in un sacco di emulatori di terminale, anche su diverse piattaforme.
    In ogni caso, se il software è da distribuire sotto forma di sorgenti ti puoi arrangiare facilmente usando delle direttive del preprocessore per scegliere il comando da chiamare per pulire lo schermo.
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Diciamo che devo darlo a persone che non sanno cos'è compilare un sorgente.
    Posso sempre arrangiarmi col system() ma avrei preferito non utilizzarlo...

  6. #6
    Eh ma purtroppo ogni sistema fa a modo suo, quindi non credo ci sia un qualcosa di standard per pulire lo schermo
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  7. #7
    Puoi uscirne in questa maniera:
    codice:
    #ifdef _WIN32
    #include <windows.h>
    #else
    #include <iostream>
    #endif
    
    void ClearScreen()
    {
    #ifdef _WIN32
        // Codice per Windows
        // Handle alla console
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        // Coordinate a cui resettare il cursore
        COORD coordScreen = { 0, 0 };
        DWORD cCharsWritten;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        DWORD dwConSize;
    
        if(hConsole==NULL)
            return;
        // Ottiene le dimensioni della console corrente
        if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
            return;
        dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    
        // Riempie lo schermo di spazi
        if( !FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten ))
            return;
        // Ottiene gli attributi di carattere correnti
        if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
            return;
        // Imposta tutto lo schermo a tali attributi
        if( !FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten ))
            return;
        // Sposta il cursore a (0,0)
        SetConsoleCursorPosition( hConsole, coordScreen );
    #else
        // Fallback sugli escape ANSI
        std::cout<<"\x1B[2J\x1B[1;1H";
        std::cout.flush();
    #endif
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Bel codice! Grazie... Funziona alla grande...

  9. #9
    Di niente ; per inciso, riguardo al system("pause"): la libreria C++ fornisce solo input bufferizzato, per cui non è possibile (andando di solo standard C++) fare una cosa del tipo "premere un tasto per continuare". Puoi tuttavia fare:
    codice:
    cout<<"Premi Invio per continuare...";
    cin.sync();
    cin.ignore();
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Il mio era system("pause>nul");
    Comunque dopo aver pulito richiede l'inserimento di un numero quindi...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.