Είσοδος και έξοδος σε χαμηλότερο επίπεδο |
Το πρόγραμμα του αρχείου SINGLEIO.C παρουσιάζει μιά άλλη μέθοδο εισόδου και εξόδου χαρακτήρων. Το κείμενο του προγράμματος είναι περίπου ίδιο με το κείμενο του προηγούμενου προγράμματος. Οι διαφορές είναι δύο: Πρώτη διαφορά η σύνδεση μιάς ακόμη βιβλιοθήκης συναρτήσεων μέσω της εντολής #include <conio.h> Πρόκειται γιά βιβλιοθήκη συναρτήσεων εισόδου εξόδου χαμηλότερου επιπέδου με αρχείο κεφαλής το CONIO.H (CONsole Input Output). Η δεύτερη διαφορά είναι η αντικατάσταση της συνάρτησης getchar με τη συνάρτηση getch. Η συνάρτηση getch διαβάζει πάλι έναν χαρακτήρα από το πληκτρολόγιο αλλά απ' ευθείας και χωρίς τη μεσολάβηση του DOS και του απομονωτή πληκτρολογίου. Επιπλέον η εκτέλεση της συνάρτησης δεν προκαλεί την αντήχηση του χαρακτήρα στην οθόνη. Το αποτέλεσμα αυτή τη φορά έχει τη μορφή Enter any characters, X = halt program. ...X End of program. Η αντίδραση του προγράμματος είναι τώρα άμεση σε κάθε πληκτρολόγησή μας και δεν χρειάζεται Enter γιά την ενεργοποίησή του. Ποιά είναι η διαφορά των βιβλιοθηκών STDIO.H και CONIO.H; Η STDIO ανήκει στις προδιαγραφές ANSI και υποστηρίζεται από όλους τους μεταφραστές C ανεξάρτητα από το λειτουργικό σύστημα (DOS, διάφορα Unix, VMS, κλπ). Οι λειτουργίες εισόδου εξόδου στηρίζονται σε κλήσεις ρουτινών του λειτουργικού συστήματος. Η CONIO αναφέρεται καθαρά σε περιβάλλοντα DOS και υποστηρίζεται από τους περισσότερους μεταφραστές C σε DOS. Ορισμένες λειτουργίες εκτελούνται με απ' ευθείας κλήσεις στο BIOS παρακάμπτοντας κλήσεις του DOS. Όμως δεν περιλαμβάνεται στις προδιαγραφές ANSI και επομένως δεν εξασφαλίζει μεταφερτότητα του προγράμαμτος σε άλλα λειτουργικά συστήματα. Εάν όμως κατά την εκτέλεση του προγράμματος προσπαθήσουμε να πατήσουμε το πλήκτρο Enter γιά να εισάγουμε νέα γραμμή τότε διαπιστώνουμε οτι η απάντηση του προγράμματος δεν είναι η αναμενόμενη. Ο δρομέας πηγαίνει μεν στην πρώτη θέση της γραμμής αλλά οχι στη νέα γραμμή αλλά στην ίδια που έγραφε προηγούμενα. Αυτό συμβαίνει γιατί όταν πιέσουμε το πλήκτρο Enter σε περιβάλλον DOS (χρήση getchar της βιβλιοθήκης STDIO.H) τότε το DOS αποθηκεύει στον απομονωτή πληκτρολογίου όχι έναν αλλά δύο χαρακτήρες, τους CR και LF (Curriage Return και Line Feed). Αντίθετα όταν πιέζουμε το Enter κατά την εκτέλεση της getch της βιβλιοθήκης CONIO.H τότε το πρόγραμμα παραλαμβάνει μόνο τον χαρακτήρα CR και όχι τον LF. Όταν επομένως θέλουμε να χρησιμοποιήσουμε συναρτήσεις εισόδου εξόδου χαμηλού επιπέδου πρέπει να παρέχουμε εμείς όλους τους χαρακτήρες ελέγχου που παρέχει το DOS όταν είναι παρόν. Ας δούμε τώρα μιά νέα έκδοση του προγράμματός μας που διοθώνει την ατέλεια που παρατηρήθηκε. Το πρόγραμμα βρίσκεται στο αρχείο BETTERIN.C. Οι δύο ορισμοί των σταθερών #define συνδέουν τους κωδικούς ASCII των χαρακτήρων ελέγχου Curriage Return και Line Feed με τα μηνμονικά τους ονόματα CR, LF. Στο σώμα της επανάληψης υπάρχει μιά πρόταση if που προσθέτει τον χαρακτήρα LF μετά από κάθε CR. Κάποιος φυσικά θα μπορούσε να παραλέιψει τους ορισμούς σταθερών και να γράψει απλά την πρόταση if (c == 13) putchar(10); που όμως δεν είναι ιδιαίτερα διαφωτιστική. Πότε χρησιμοποιούμε την είσοδο με απομονωτή και πότε την είσοδο χωρίς απομονωτή; Η είσοδος χωρίς απομονωτή είναι χρήσιμη σε διαλογικά προγράμματα όπου θέλουμε η πίεση ενός πλήκτρου (ή συνδυασμού πλήκτρων) χωρίς απαραίτητα τη συνοδία Enter να προκαλεί μιά δράση (π.χ. επιλογή σε menu). Η είσοδος με απομονωτή είναι πιό σίγουρη και γρήγορη γιά προγράμματα με αρκετό όγκο δεδομένων αφού το πρόγραμμά μας δεν ασχολείται άμεσα με το διαβασμα του κάθε χαρακτήρα ξεχωριστά. Ορισμένες ακόμη ενδιαφέρουσες συναρτήσεις συνδέονται με την είσοδο και έξοδο απλών χαρακτήρων. Αν και δεν είναι μέρος των προδιαγραφών ANSI αφού ανήκουν στη βιβλιοθήκη CONIO είναι πολύ συνηθισμένες σε περιβάλλον DOS. Η πρώτη είναι η συνάρτηση putch η οποία μπορεί να αντικαταστήσει την putchar χωρίς καμμία επίπτωση. Η δεύτερη είναι η συνάρτηση getche που λειτουργεί ακριβώς όπως η getch αλλά παρέχει και αντήχηση. Η τρίτη είναι η συνάρτηση ungetch που δουλεύει σε συνδυασμό με την getch.. Σε πολλές περιπτώσεις χρειάζεται να διαβάσουμε έναν χαρακτήρα γιά να διαπιστώσουμε ότι δεν τον θέλουμε, οτι δηλαδή ανήκει στην επόμενη επεξεργασία. Αυτός ο χαρακτήρας δεν πρέπει να χαθεί από τη συσκευή εισόδου. Η συνάρτηση ungetch τον 'επιστέφει' στην είσοδο γιά να διαβαστεί με το επόμενο getch. Αυτό μπορεί να συμβεί μόνο γιά έναν χαρακτήρα κάθε φορά. |
![]() |
![]() |
![]() |