Einlesen von der Konsole



  • es gilt scheinbar fuer alle streams, aber wenn das terminal gepuffert ist, kann ansi c nichts machen.

    @OP: such dir eine plattform raus und ich verschieb dich in ein anderes unterforum. mit ansi c gehts leider nicht.



  • tja das will ich aber nicht. Es ist Anforderung, dass es unter windows genauso läuft wie unter linux....



  • du kannst versuchen, ob du conio.h auf beiden plattformen benutzen kannst.
    die hat naemlich getch(), welches eigentlich ungepuffert lesen sollte.
    curses.h hat auch ein getch(), also koenntest du mit #ifdefs bedingt jeweils den einen oder anderen header inkludieren.

    ist aber kein ansi c. ich kann dir da echt nicht weiterhelfen.

    wieso willst du so zwanghaft solche speziellen features crossplattformkompilierbar haben?
    schreib doch fuer jede plattform einen extra client und server.
    die kernfunktionen kannst du ja auslagern, weil sie auf allen plattformen gleich sind. lediglich die konsolenein/ausgabe musst du doppelt schreiben.



  • conio.h unter Linux wirds nicht finden...

    Tja, WENN die Anforderung ist, dass es unter beiden Plattformen gehen soll UND es keine ANSI-gerechte Methode gibt das Buffering zu kontrollieren, DANN:

    a) Arschgekniffen, Aufgabe unlösbar (das wäre der Programmierer, der gefeuert wird)
    b) Mittels bedingter Kompilierung eine Funktion schaffen, die auf jeder Plattform die dort benötigte Aufgabe erfüllt.

    Für Linux könnte ich Dir bei Interesse sogar ein Schnippsel zukommen lassen (ohne ncurses sogar).



  • Bitte löschen (BTW: Wenn ihr Spenden braucht damit das Forum nicht täglich mindestens einmal lahm liegt, ich würde mich bereiterklären).



  • warum löschen?

    Ja an einem Codeschnipsel für linux wäre ich interessiert. Bedingte Kompilierung ist auch OK.



  • Hier die Linux-Variante (es empfiehlt sich beim Beenden die zweite Funktion aufzurufen, da sonst das normale Terminal anschliessend auch unbuffered ist):

    #include <termios.h>
    #include <unistd.h>
    
    termios oldattr;
    
    void make_term_unbuffered(void)
    {
            int c;
            struct termios attr;
            tcgetattr(STDIN_FILENO, &oldattr);
            memcpy(&attr, &oldattr, sizeof(struct termios));
            attr.c_lflag &= ~ICANON;
            tcsetattr(STDIN_FILENO, TCSANOW, &attr);
    }
    
    void make_term_normal(void)
    {
            tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
    }
    

    EDIT: Löschen weil ich dreimal "Absenden" klicken musste ohne nen Timeout vom Board zu erhalten, der Beitrag aber später dreimal vorhanden war...



  • super dein code funktioniert....

    hast du vielleicht noch eine idee wie man das echo rauskriegt?



  • hab schon, ist schon gut! aber ihr könnt mir mal sagen ob der gcc ein makro hat was man verwenden kann, um das OS zu bestimmen oder ob man sein eigenes anlegen muss.

    Gruß





  • danke schön. unter linux funktioniert das jetzt perfekt. Unter windows muss ich erst gucken ob der aufruf von getch reicht. meld mich dann nochmal 😉

    Aber danke schonmal


Anmelden zum Antworten