Αλλαγή γραμματοσειράς
Ημερομηνία Πέμ Απρ 18, 2019 5:49 pm
foss.aueb.gr
Αρχική Κοινότητας Courses C / C++

C / C++

Input συνάρτηση σε C

Προγραμματισμός σε C ή C++ - ερωτήσεις - απορίες - αλγόριθμοι - etc
Related Courses: Προγραμματισμός με C++, Λειτουργικά Συστήματα, Γραφικά, Δίκτυα Υπολογιστών

Input συνάρτηση σε C

Δημοσίευσηαπό Luke » Σάβ Ιαν 02, 2010 1:32 pm

Τον τελευταίο καιρό ασχολούμαι λίγο με C κι έχω την εξής απορία.

Υπάρχει καμιά συνάρτηση που παρόμοια της getchar() αλλά που να μην κάνει buffer τους χαρακτήρες; Στο e-book από το οποίο μελετάω αναφέρει την getch() αλλά απ' ό,τι φαίνεται αυτή παίζει μόνο σε MS-DOS, στο Ubuntu δεν την αναγνωρίζει. Ψάχνοτας στο Internet δεν κατάφερα να βρω κάτι που να είναι "built-in" στη C παρά μόνο μια custom υλοποίηση ενός χρήστη στο cprogramming.com. Απλά μου κάνει εντύπωση να μην υπάρχει κάτι τέτοιο έτοιμο...

Να αναφέρω ότι χρησιμοποιώ τον gcc σε NetBeans.
Άβαταρ μέλους
Luke
Open Member
 
Δημοσ.: 17
Εγγραφη: Σάβ Μάιος 23, 2009 8:00 pm
Operating System: Ubuntu 11.04, Windows 7

Re: Input συνάρτηση σε C

Δημοσίευσηαπό arpl » Σάβ Ιαν 02, 2010 3:48 pm

$sudo apt-get install manpages-dev
$man setbuf

Και νομίζω πως με τη setvbuf() ορίζεις πως θες να γίνει(ή όχι) το buffering.
Άβαταρ μέλους
arpl
Open Member
 
Δημοσ.: 66
Εγγραφη: Πέμ Μάιος 07, 2009 5:34 pm
Τοποθεσια: /dev/null
Operating System: NONE

Re: Input συνάρτηση σε C

Δημοσίευσηαπό Luke » Κυρ Ιαν 03, 2010 1:22 am

Δυστυχώς δε δούλεψε. Το πρόγραμμα υποτίθεται ότι διαβάζει χαρακτήρες τους οποίους και τυπώνει μέχρι να συναντήσει το 'Χ', όπου και τερματίζει. Αλλά έτσι όπως είναι τώρα περιμένει το "Enter" για να τους τυπώσει. Βασικά δε με πειράζει τόσο πολύ να το κάνω να δουλέψει unbuffered, απλά μου έκανε εντύπωση που δεν υπάρχει κάτι "έτοιμο".
Ακολουθεί ο κώδικας σε περίπτωση που υπάρχει καμιά άλλη ιδέα ή που μπορεί να έχω κάνει λάθος και να μην το καταλαβαίνω.

Κώδικας: Επιλογή όλων
void input()
{
    setvbuf(stdin, (char *) NULL, _IONBF, 0);
    char c;
    printf("input any characters,hit X to stop.\n");
    do {
        c = getchar();     /* Get a character from the kb */
        putchar(c);        /* Display the character on the monitor */
        if (c == CR) putchar(LF); /* if it is a carriage return
                                     put out a linefeed too --> doesn't actually works*/
    } while (c != 'X');      /* Until and X is hit */
    printf("\nEnd of program.\n");
}


[Reveal] Spoiler:
Ποιο καλό παιδί έχει βάλει να γίνεται αυτόματη μετατροπή του ΕμΕς (εννοώ τους αγγλικούς χαρακτήρες) σε Micro$oft; Έτσι ενώ έχω γράψει ΕμΕς-DOS παραπάνω το έχει μετατρέψει σε Micro$oft-DOS. :D
Άβαταρ μέλους
Luke
Open Member
 
Δημοσ.: 17
Εγγραφη: Σάβ Μάιος 23, 2009 8:00 pm
Operating System: Ubuntu 11.04, Windows 7

Re: Input συνάρτηση σε C

Δημοσίευσηαπό c00kiemon5ter » Κυρ Ιαν 03, 2010 5:46 am

Hack it! Από κάπου το είχα πάρει αυτό και το είχα αλλάξει για να για να φτιάξω μια συνάρτηση για password inputs ;)
Αυτό που κάνει η getch() είναι ότι διαβάζει χαρακτήρες χωρίς να τους εμφανίζει στην οθόνη κι επιπλέον επιστρέφει τους χαρακτήρες στο καλών πρόγραμμα μόλις αυτοί εισαχθούν, no buffering.

Κώδικας: Επιλογή όλων
# include <stdio.h>
# include <stdlib.h>
# include <termios.h>
# include <unistd.h>

/* ctrl-d or set it to whatever you want */
# define END_FILE_CHARACTER 0x04

/* getch - modified version of linux-getch() */
int getch() {
    struct termios oldattr, newattr;
    int ch;

    /* get currect attributes and save them to $oldattr */
    tcgetattr(STDIN_FILENO, &oldattr);

    /* reset "canonical" and "echo" flags and apply new attributes */
    newattr = oldattr;
    newattr.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr);

    /* read the character with the new attributes */
    ch = getchar()

    /* restore old attributes */
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);

    /* check for escape character */
    if (ch == END_FILE_CHARACTER)
        ch = EOF;
    return ch;
}

[Reveal] Spoiler: όλο παράπονα
έφτιαξα το MS cencoring..
Computers are simple. You just write an instruction and they follow it.
Εικόνα
a cookie! ~ i.will.do.science.to.it! Εικόνα
Άβαταρ μέλους
c00kiemon5ter
cookie hunter
 
Δημοσ.: 554
Εγγραφη: Δευτ Μάιος 11, 2009 1:55 am
Τοποθεσια: (void *)NULL
Operating System: ~ Arch ~ .: Gentoo :.

Re: Input συνάρτηση σε C

Δημοσίευσηαπό HdkiLLeR » Δευτ Ιαν 04, 2010 1:55 am

Luke έγραψε:Υπάρχει καμιά συνάρτηση που παρόμοια της getchar() αλλά που να μην κάνει buffer τους χαρακτήρες;


Δεν υποστηρίζεται κάτι τέτοιο απο την libc άμμεσα (ούτε και απο την glibc μιας και αναφέρθηκες στο Linux). Μπορεί να φαίνεται παράξενο αλλά δεν έχει νόημα κάτι τέτοιο γιατί μπλέκεις με πράγματα που γίνονται σε διαφορετικά layers. Πιο συγκεκριμένα, κάθε executable είναι γνωστό οτι έχει 3 file descriptors ανοιχτά με το καλημέρα (0, 1, 2), και τα οποία μπορείς να τα "δεις" και σαν streams ώς stdio, stdout, stderr. Κάθε stream (στην πραγματικότητα κάθε file descriptor) έχει ένα ολόκληρο struct associated στον kernel που ορίζει διάφορα options του stream (πχ buffer size, buffering type, access bits κλπ κλπ). Με τις system calls που χρησιμοποιείς (setvbuf() κλπ) αλλάζεις τα properties στις αντίστοιχες δομές στον πυρήνα και όντως δεν υπάρχει buffering πλέον -- δεν έχεις κάνει check βέβαια ποιό είναι το return value της syscall που χρησιμοποιείς αλλά και να το τσεκάρεις θα δεις ότι ήταν successful.

Το θέμα είναι ότι με αυτόν τον τρόπο πειραξες το κομμάτι που σχετίζεται με την εφαρμογή. Στην περίπτωση σου όμως μην ξεχνάς ότι το executable που τρέχεις το τρέχεις μέσα απο κάποιο terminal. Είτε σε πραγματική console (δεν νομίζω) είτε μέσα απο κάποιο terminal emulator (xterm, gconsole, konsole κλπ). Συνεπώς απο το keyboard (στην ουσία απο τον kernel που κάνει handle τα interrupts του keyboard σου) μέχρι την εφαρμογή υπάρχει ένα ακόμη layer -- το terminal I/O layer. Εκεί υπάρχει ένα ακόμη επίπεδο ενταμίευσης και αυτό είναι που πειράζει ο Jesus παραπάνω.

Luke έγραψε:Απλά μου κάνει εντύπωση να μην υπάρχει κάτι τέτοιο έτοιμο...


Check in the right place -- termios(3), console_ioctl(4), tty_ioctl(4)
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
Άβαταρ μέλους
HdkiLLeR
Open Member
 
Δημοσ.: 36
Εγγραφη: Παρ Μάιος 15, 2009 2:57 am
Τοποθεσια: Manhattan - New York

Re: Input συνάρτηση σε C

Δημοσίευσηαπό Luke » Δευτ Ιαν 04, 2010 2:14 am

Ευχαριστώ πολύ όλους για τα σχόλια και τις παρατηρήσεις. Νομίζω ότι πλέον βγαίνει νόημα.
Άβαταρ μέλους
Luke
Open Member
 
Δημοσ.: 17
Εγγραφη: Σάβ Μάιος 23, 2009 8:00 pm
Operating System: Ubuntu 11.04, Windows 7


Επιστροφή στην C / C++

cron
foss.aueb.gr

Μελη σε συνδεση

Συνολικά υπάρχουν 0 μέλη συνδεδεμένα: 0 εγγεγραμμένο, 0 κρυφοί και 0 επισκέπτης (με βάση τα μέλη που έχουν συνδεθεί τα τελευταία 5 λεπτά)
Περισσότερα μέλη σε σύνδεση 167 την Κυρ Οκτ 02, 2016 2:55 am

Μέλη σε αυτή την Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες

Γενέθλια

Κανένα μέλος δεν έχει γενέθλια σήμερα