Προς το περιεχόμενο

clear screen κώδικας στη C


karabouzouk...

Προτεινόμενες αναρτήσεις

Δημοσ.

Γι αυτό ακριβώς έψαξα μόλις για το λόγο ότι απ ότι διαπίστωσα το system("cls");

δεν δουλεύει πάντα και βρήκα αυτό...

>#include <stdio.h>

int main(void)
{
 	printf("\033[2J");
printf("\033[1;1H");
       getchar();
return 0;
}

 

Αλλά δεν θέλω να χρησιμοποιώ κάτι που δεν καταλαβαίνω οπότε αν γίνεται να έχω μια εξήγηση του τι ακριβώς είναι πχ το "\033[2J"...

όποιο σχόλειο για τη λειτουργικότητα του κώδικα ή βελτίωση κλπ δεκτή..!

ευχαριστώ!

Δημοσ.

XP έχω.. δεν είναι εκει το πρόβλημα... απλά σε διαφορετικά μηχανήματα που το έχω δοκιμάσει μια τρέχει μια όπως και στο δικό μου μου βγάζει όχι error στο compiling αλλά όταν τρέχει το πρόγραμμα ότι δεν βρέθηκε η εντολή.. και γι αυτό έψαξα για μια γενικότερη μέθοδο..

Δημοσ.

Εννοείς ότι θέλεις να κάνεις τον κώδικά σου φορητό (να μεταγλωττίζεται και να εκτελείται σωστά και σε διαφορετικά από Windows περιβάλλοντα) ; Ή τα άλλα μηχανήματα στα οποία δοκίμασες έτρεχαν επίσης Windows... ;

Δημοσ.
Γι αυτό ακριβώς έψαξα μόλις για το λόγο ότι απ ότι διαπίστωσα το system("cls");

δεν δουλεύει πάντα και βρήκα αυτό...

>#include <stdio.h>

int main(void)
{
 	printf("\033[2J");
printf("\033[1;1H");
       getchar();
return 0;
}

 

Αλλά δεν θέλω να χρησιμοποιώ κάτι που δεν καταλαβαίνω οπότε αν γίνεται να έχω μια εξήγηση του τι ακριβώς είναι πχ το "\033[2J"...

όποιο σχόλειο για τη λειτουργικότητα του κώδικα ή βελτίωση κλπ δεκτή..!

ευχαριστώ!

 

Νομίζω αν κάνεις include το <iostream> δουλεύει πάντα η system("cls"). Χωρίς αυτό σε μένα δε δούλεψε με compiler Dec-c/cpp.

Δημοσ.

Το iostream μάλλον είναι σε C++... εγώ περπατάω ακόμη ατη C...!

στη C είναι το stdlib.h

Βασικά ήθελα μόνο να δουλεύει σε μένα αρχικά...αλλά και η φορητότητα αν επιτυγχάνεται καλή είναι...

Θα με ενδιέφερε ο κώδικας που έχουν τα XP ή τα Linux για το cls ή clear...

Δημοσ.

To 33[2J είναι ένα escape-sequence προς το stdout, εκεί υποθέτω ότι τρέχει κάποιος driver που το αναγνωρίζει και οδηγεί σε καθαρισμός της οθόνης και ενδεχομένως σε επαναφορά του text cursor στην αριστερή κορυφή του παραθύρου (\033[1;1H).

 

Σε εποχές MS-DOS υπήρχε ένας παρόμοιος driver, ο περίφημος ANSI.SYS ο οποίος αναγνώριζε εκτός αυτού φυσικά και άλλα παρόμοια escape-sequences στο stdout και δρούσε ανάλογα, είτε καθαρίζοντας την οθόνη, είτε μετακινώντας το text cursor είτε αλλάζοντας χρώματα, φυσικά αν δεν έτρεχες στο σύστημα σου τον ANSI.SYS αυτά τα escape-sequences απλά εκτυπώνονταν στο stdout δίχως κανένα αποτέλεσμα. Καθώς ο ANSI.SYS καταλάμβανε μεγάλο τμήμα στην μνήμη ελάχιστοι ήταν οι χρήστες του και έτσι αν εξαιρέσουμε κάποια ascii-arts που τον χρησιμοποιούσαν, δεν γνώρισε τελικά ιδιαίτερη διάδοση.

 

Clear-screen στην C ή C++ δεν προβλέπεται οπότε για κάτι τέτοιο καταφεύγουμε πάντα σε custom εντολές ή βιβλιοθήκες (όπως η περίφημη conio.h που προσέφεραν σχεδόν όλοι οι DOS και αρκετοί Windows compilers) ή σε τέτοιου είδους ANSI escape-sequences αν και όταν είμαστε σίγουροι ότι τρέχουν οι κατάλληλοι οδηγοί που μπορούν να τα αποκωδικοποιήσουν.

 

Υ.Γ.

Συγκεκριμένα (για την ιστορία) το printf(“\033[2J”); είναι η προτεινόμενη μέθοδος cls για «ANSI οθόνες» (sic), σύμφωνα με το «Εισαγωγή στην Γλώσσα C» (1992) του Κων/νου Λιβάδα (σελ. 38, δεύτερη υποσημείωση). Το \033[1;1H μετακινεί τον text-cursor στο πάνω αριστερό τμήμα της οθόνης (σελ. 38, πρώτη υποσημείωση -gotoxy σε ANSI) :-)

Δημοσ.

Δοκίμασε τo clrscr() με βιβλιοθήκη conio.h που είναι μια εναλλακτική του system("cls") αλλά δε ξέρω αν σου κάνει ή αν έχει καμιά διαφορά αυτό....

Δημοσ.
To 33[2J είναι ένα escape-sequence προς το stdout, εκεί υποθέτω ότι τρέχει κάποιος driver που το αναγνωρίζει και οδηγεί σε καθαρισμός της οθόνης και ενδεχομένως σε επαναφορά του text cursor στην αριστερή κορυφή του παραθύρου (\033[1;1H).

 

Σε εποχές MS-DOS υπήρχε ένας παρόμοιος driver, ο περίφημος ANSI.SYS ο οποίος αναγνώριζε εκτός αυτού φυσικά και άλλα παρόμοια escape-sequences στο stdout και δρούσε ανάλογα, είτε καθαρίζοντας την οθόνη, είτε μετακινώντας το text cursor είτε αλλάζοντας χρώματα, φυσικά αν δεν έτρεχες στο σύστημα σου τον ANSI.SYS αυτά τα escape-sequences απλά εκτυπώνονταν στο stdout δίχως κανένα αποτέλεσμα. Καθώς ο ANSI.SYS καταλάμβανε μεγάλο τμήμα στην μνήμη ελάχιστοι ήταν οι χρήστες του και έτσι αν εξαιρέσουμε κάποια ascii-arts που τον χρησιμοποιούσαν, δεν γνώρισε τελικά ιδιαίτερη διάδοση.

 

Clear-screen στην C ή C++ δεν προβλέπεται οπότε για κάτι τέτοιο καταφεύγουμε πάντα σε custom εντολές ή βιβλιοθήκες (όπως η περίφημη conio.h που προσέφεραν σχεδόν όλοι οι DOS και αρκετοί Windows compilers) ή σε τέτοιου είδους ANSI escape-sequences αν και όταν είμαστε σίγουροι ότι τρέχουν οι κατάλληλοι οδηγοί που μπορούν να τα αποκωδικοποιήσουν.

 

Υ.Γ.

Συγκεκριμένα (για την ιστορία) το printf(“\033[2J”); είναι η προτεινόμενη μέθοδος cls για «ANSI οθόνες» (sic), σύμφωνα με το «Εισαγωγή στην Γλώσσα C» (1992) του Κων/νου Λιβάδα (σελ. 38, δεύτερη υποσημείωση). Το \033[1;1H μετακινεί τον text-cursor στο πάνω αριστερό τμήμα της οθόνης (σελ. 38, πρώτη υποσημείωση -gotoxy σε ANSI) :-)

 

Κατατοπιστικότατος...!!!! Εύγε..!

Η conio θα δουλέψει σε Linux...?

Δημοσ.
Η conio θα δουλέψει σε Linux...?

 

Η conio.h των DOS/Windows compiler όχι, τώρα αν υπάρχει conio.h για Linux δεν γνωρίζω, από όσο όμως έχω υπόψη μου (δυστυχώς) όχι -φυσικά υποθέτω ότι υπάρχουν άλλες ανάλογες βιβλιοθήκες για αυτό το Λ.Σ. με παρόμοιες δυνατότητες αλλά καθώς δεν προγραμματίζω σε Linux/Unix δεν μπορώ να σε κατατοπίσω. :-(

Δημοσ.

Το θέμα δεν είναι να τυπώσεις 50 ή 100 γραμμές (δέχομαι βέβαια ότι σε κάποια λογισμικά αυτό είναι αρκετό) αλλά να φέρεις τον text-cusor στην κορυφή της οθόνης (αν θες να "ζωγραφίσεις" για παράδειγμα ένα text mode GUI) και εκεί είναι το πρόβλημα για αυτό καταλήγουμε σε ANSI.SYS ή conio.h ή στις βιβλιοθήκες του Linux, δυστυχώς.

Δημοσ.

Θα με ενδιέφερε ο κώδικας που έχουν τα XP ή τα Linux για το cls ή clear...

 

Να οι συναρτήσεις των XP για διαχείριση κονσόλας: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

 

Στο DOS τα προγράμματα είτε χρησιμοποιούσαν τις συναρτήσεις του Int 10 του BIOS, είτε έγραφαν κατευθείαν στη VideoRAM και στους καταχωρητές της κάρτας γραφικών.

 

 

Η conio είναι μία βιβλιοθήκη με ρίζες στο DOS η οποία πατάει στα παραπάνω και προσφέρει κοινή υλοποίηση σε DOS / Windows.

Μάλιστα έχει βγει και κλώνος της για Linux: http://sourceforge.net/projects/linux-conioh

 

Η ncurses είναι άλλη μια βιβλιοθήκη με ρίζες στο Unix η οποία κάνει το ίδιο πράγμα. Επίσης έχει βγει κλώνος της για Windows: http://gnuwin32.sourceforge.net/packages/ncurses.htm

 

Το ANSI escape sequence που έχεις στην αρχή του θέματος είναι ένας τρίτος τρόπος να κάνεις το ίδιο πράγμα - αλλά δεν θα παίξει στα Windows επειδή δεν είναι συμβατά με αυτό το πρότυπο (εκτός από 16bit εφαρμογές). Σε DOS έπαιζε αλλά μόνο αν είχε φορτωθεί το ANSI.SYS όπως είπε ο DirectX.

 

 

Πέρα από την υλοποίηση: το να κάνεις clear screen σε ένα απλό πρόγραμμα είναι απλά ενοχλητικό και αποπροσανατολίζει τη συνήθη λειτουργία (ομαλής κύλισης) του τερματικού. Ο καθαρισμός της οθόνης δικαιολογείται μόνο αν χρησιμοποιείς κι άλλες συναρτήσεις του conio.h (π.χ. gotoxy, textcolor, getch...) ώστε να προσφέρεις ένα παραθυρικό περιβάλλον, για παράδειγμα έναν text editor.

Υπάρχει λόγος που σχεδόν κανένας πια δεν ασχολείται με αυτές τις ξεχασμένες βιβλιοθήκες... :)

Δημοσ.

Μήπως πέσαν μαζεμένες ασκήσεις απο κανένα "παππού" καθηγητή που είχε συνηθήσει τον έλεγχο οθόνης dos;

 

Να και άλλες αναφορές με κώδικα σε dos/windows 16 bit:

π.χ. http://www.adslgr.com/forum/showpost.php?p=2776533&postcount=12

 

και η βιβλιοθήκη windows console 32/64bit:

http://www.adslgr.com/forum/showpost.php?p=2779042&postcount=19

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...