Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Problem mit Eingaben

  1. #1
    JRausi
    Gast

    Unhappy Problem mit Eingaben

    Hallo!

    Ich als Pascal-Umsteiger auf C/C++ hab da noch ein paar Probleme mit manchen
    Befehlen.
    'cout' nehme ich um Ausgaben auf den Bildschirm zu bringen.
    'cin' um Eingaben DIE MIT <ENTER> ABGESCHLOSSEN WERDEN MÜSSEN.
    ... und genau da ist das Problem: Wie kann ich Tastatureingaben
    kontrollieren/abfangen ohne das man erst <ENTER> drücken muß???
    (Bei Pascal gab's da den Befehl 'readkey' bzw. auch 'keypressed'.)

    Danke für Eure Hilfe


    Tschö
    Jörg
    <joerg.rausendorf@epost.de>

  2. #2
    mxxx
    Gast

    Post

    unter Linux kann das schwer werden...
    unter Windows gibts conio.h
    also:
    #include <conio.h>
    //...
    char key = getch();

    aber unter Linux gibts kein conio.h file.
    ich werde hier mal n source für ne nachprogrammierte conio.h file reintun.. hab etwas gedult. Allerdings kann dann nur der
    Supteruser (root) solche Programme ausführen.

  3. #3
    Pingu
    Gast

    Post

    Hi,

    schon mal voraus unter Linux hab ich noch nie programmiert, aber

    probier doch mal 'getchar()' anstatt von 'getch()'. denn 'getchar()' ist eine standard ANSI-C funktion aus 'stdio.h' und sollte somit theoretisch auch von linux unterstützt werden.

    Gruß

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-= Pingu =-

    PS: Ein sehr gute Hilfe für mich ist die Hilfe von Borland C++. Da steht nämlich bei jeder Funktion die Portabilität dazu.

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    In der Standardeinstellung arbeiten Ein- und Ausgabe gepuffert, d.h. getc (getch, getchar) kehren erst zurück, wenn die Eingabe mit einem [Return] abgeschlossen wird.

    Die Pufferung kann u.a. mit cbreak bzw. nocbreak ab- bzw. angeschalten werden. Diese Funktionen sind in curses.h enthalten.

    Thomas

  5. #5
    mxxx
    Gast

    Post

    Kannst du dann mal die Funktion getch()
    nachprogrammieren? Also sie liest genau ein
    Zeichen von der Tastatur, ohne es mit RETURN
    zu beenden!

  6. #6
    Registrierter Benutzer
    Registriert seit
    21.01.2001
    Beiträge
    157

    Post

    Das war mal ne Uebungsaufgabe zu dem Thema.
    Sollte als Grundlage (mit passendem man-page Studium) reichen. Viel Spass damit ;-)
    Code:
    #include &lt;stdlib.h&gt;
    #include &lt;stdio.h&gt;
    #include &lt;unistd.h&gt;
    #include &lt;termios.h&gt;
    #include &lt;errno.h&gt;
     
    /* define keycodes according to extended ASCII */
    #define ASCII_ESC 27
    #define ASCII_CTRL_E 5
    #define ASCII_CTRL_N 14
     
    /* shortcut for simple system/library-call error checking */
    #define ERROR_CHECK(error_condition)\
    if (error_condition){\
      perror("type");\
      exit(EXIT_FAILURE);\
    }
          /* terminal modes */
    struct termios oldmode;
    struct termios newmode;
     
    /* restore previous terminal mode */
    void cleanup(){
      tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldmode);
    }
     
    /* someone has to do the main work :-) */
    int main(int argc,char * argv[]){
      char ch;
      int loop;
      int tty=0;
     
      /* do we have a terminal to manipulate? */
      if (isatty(STDIN_FILENO)==1){
        /* save old mode */                 
         ERROR_CHECK((tcgetattr(STDIN_FILENO,&oldmode)&lt;0)&#0124;&#0124;(tcgetattr(STDIN_FILENO,&newmode)<0));
     
        /* install cleanup function */
        ERROR_CHECK(atexit(cleanup)&lt;0);
     
        /* set noncanonical,signal ignoring,one char returning terminal mode */
        newmode.c_lflag &= ~(ICANON|ISIG);
        newmode.c_cc[VMIN] = 1;
        newmode.c_cc[VTIME] = 0;
        ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
        tty=1;
      }
      /* while escaped has not been typed */
      for (loop=1;loop;){
        /* read a single character */
        while (read(STDIN_FILENO,&ch,1)&lt;0) ERROR_CHECK(errno!=EINTR); 
             switch (ch){
        case ASCII_ESC: /* exit */
          loop=0;
          break;
        case ASCII_CTRL_N: /* turn off echo */
          if (!tty) break;
          newmode.c_lflag &= ~ECHO;
          ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
          break;
        case ASCII_CTRL_E: /* turn on echo */
          if (!tty) break;
          newmode.c_lflag |= ECHO;
          ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
          break;
        default: /* own echo on stdout */
          while (write(STDOUT_FILENO,&ch,1)&lt;0) ERROR_CHECK(errno!=EINTR);
        }                 
      return EXIT_SUCCESS;
    }

  7. #7
    Registrierter Benutzer
    Registriert seit
    21.10.2000
    Ort
    Köln
    Beiträge
    30
    Original geschrieben von thommy
    In der Standardeinstellung arbeiten Ein- und Ausgabe gepuffert, d.h. getc (getch, getchar) kehren erst zurück, wenn die Eingabe mit einem [Return] abgeschlossen wird.

    Die Pufferung kann u.a. mit cbreak bzw. nocbreak ab- bzw. angeschalten werden. Diese Funktionen sind in curses.h enthalten.

    Thomas
    ich muß das Thema nochmal auffrischen: das einbinden der curses.h Klappt, aber der Linker kommt mit dem Ganzennicht klar, er kann die funktionen cbreak() und nocbreak() nicht auflösen in was für ner lib oder was für ner .o File kann man die funktionen suchen lassen?
    Wenn was absolut nicht funktioniert nenn es Windows *gg*

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wie sieht dein Linkeraufruf aus?

    #> gcc -o meinprog meinsource.o -L/usr/lib -lcurses

    Sollte gehen.

    Ciao,
    _

  9. #9
    Registrierter Benutzer
    Registriert seit
    12.12.1999
    Ort
    Landshut
    Beiträge
    80
    // EinzelnesZeichen.cpp

    #include<curses.h>
    #include<iostream>

    int main()
    {
    int c;

    // Terminaltyp bestimmen
    initscr();

    // Zeichen sofort ausgeben ohne Enter
    raw();

    // Zeichen lesen
    c=getch();

    // Terminal wieder zuruecksetzen
    endwin();

    // Zeichen schreiben
    cout.put(c);
    }

    Kompilieren mit:
    g++ -lncurses EinzelnesZeichen.cpp -o EinzelnesZeichen

    Gruss Rupert
    Geändert von rup (08-03-2002 um 16:05 Uhr)

  10. #10
    Registrierter Benutzer
    Registriert seit
    21.10.2000
    Ort
    Köln
    Beiträge
    30
    War ne weile weg, drum erst jetzt wieder ne Antwort:

    ich bin aber immer noch nicht weiter

    gcc -o meinprog meinsource.o -L/usr/lib -lcurses
    tut es zwar aber die eingabe muß trotzdem noch mit <Enter> abgeschloßen werden damit was passiert.

    und die zweite möglichkeit von rup tut es leider auch nicht da die bibilotek ncurses nicht gefunden wird

    vieleicht noch als Hinweis: ich versuch das ganze auf nem SINIX Hobel
    Wenn was absolut nicht funktioniert nenn es Windows *gg*

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    AFAIK ist ncurses nur eine neuere Version von curses, evenuell mit ein paar Erweiterungen.

    Versuch rups Beispiel mit curses zu linken.

    Ciao,
    _

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •