direkte Eingaben von der Tastatur in C
direkte Eingaben von der Tastatur in C
Moin,
wie kann man in C direkte Eingaben von der Tastatur einlesen ohne
auf die Eingabe der return-Taste zu warten ?
Ciao, Andy
wie kann man in C direkte Eingaben von der Tastatur einlesen ohne
auf die Eingabe der return-Taste zu warten ?
Ciao, Andy
-
- Posts: 85
- Joined: 24. Jan 2000 14:28
- Location: Nürnberg
Re: direkte Eingaben von der Tastatur in C
Hallo,
versuch's doch mal mit den ncurses.
man curses
Damit kann man noch viel mehr so zeug machen.
Ciao, PsychoZapp (sprich seitcho sepp)
Grad fällt's mir noch ein:
Es gibt auch Slang, aber davon hab ich kaum
Ahnung. Ich weiß nur das es das Interface für
DOS und Linux gibt. Aber ich denke mit den
Curses bist du gut beraten.
versuch's doch mal mit den ncurses.
man curses
Damit kann man noch viel mehr so zeug machen.
Ciao, PsychoZapp (sprich seitcho sepp)
Grad fällt's mir noch ein:
Es gibt auch Slang, aber davon hab ich kaum
Ahnung. Ich weiß nur das es das Interface für
DOS und Linux gibt. Aber ich denke mit den
Curses bist du gut beraten.
Last edited by psychozapp on 29. Feb 2000 19:39, edited 2 times in total.
Re: direkte Eingaben von der Tastatur in C
Diese Frage hat hier Phil am 02-Sep-1999 18:27:11 unter dem Titel "Anfängerfrage" schon einmal gestellt.
Hier ist ein Link auf diesen UltraBoard-Thread: <!--http--><a href="http://www.pro-linux.de/cgi-bin/UltraBo ... 04&Post=11" target="_blank">Artikel Nr. 11</a><!--url-->
Folgend ein Auszug aus der Pro-Linux C/C++ HOWTO:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
4.4. Eine Return-lose Eingabe realisieren ?
Q: Wie kann man mit C/C++ ein Eingabefeld realisieren, mit dem ohne
Bestaetigung mit Return ein Zeichen aufgenommen wird ?
Beispiel:
#include <iostream> // cout, cin
using namespace std;
//-----------------------------
int main(int argc, char** argv)
//-----------------------------
{
char EinZeichen;
cout << "Zeichen eingeben: " << endl;
cin >> EinZeichen; // Das hier nur eben OHNE RETURN
// wenn es geht
cout << "Zeichen war " << EinZeichen << endl;
return (0);
}
A: Die Standardbibliotheken sowohl von C als auch C++ arbeiten auf
Eingabe- und Ausgabe-Streams. Sonst gibt es nichts. Und das Terminal
ist dafuer zustaendig, beispielsweise eben den stdin-stream mit den
Tastatureingaben zu fuellen. Soweit bestens. Aber das tut so ein
Terminal nur zeilenweise nach bestaetigen mit Return. Demnach kann
man mit den stream-Geschichten nun mal beim besten Willen keine
solche return-lose Eingabe realisieren.
Statt dessen kann man aber was programmieren, was nicht ueber die
streams geht. Also direkt mit dem Terminal arbeitet.
Beispielsweise ncurses... kann da aber nicht aus eigener Erfahrung
reden, weil ich das noch nie selbst gemacht hab.
Aber mit sowas geht das zu machen.
</font><hr></pre></blockquote>
Hier ist ein Link auf diesen UltraBoard-Thread: <!--http--><a href="http://www.pro-linux.de/cgi-bin/UltraBo ... 04&Post=11" target="_blank">Artikel Nr. 11</a><!--url-->
Folgend ein Auszug aus der Pro-Linux C/C++ HOWTO:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
4.4. Eine Return-lose Eingabe realisieren ?
Q: Wie kann man mit C/C++ ein Eingabefeld realisieren, mit dem ohne
Bestaetigung mit Return ein Zeichen aufgenommen wird ?
Beispiel:
#include <iostream> // cout, cin
using namespace std;
//-----------------------------
int main(int argc, char** argv)
//-----------------------------
{
char EinZeichen;
cout << "Zeichen eingeben: " << endl;
cin >> EinZeichen; // Das hier nur eben OHNE RETURN
// wenn es geht
cout << "Zeichen war " << EinZeichen << endl;
return (0);
}
A: Die Standardbibliotheken sowohl von C als auch C++ arbeiten auf
Eingabe- und Ausgabe-Streams. Sonst gibt es nichts. Und das Terminal
ist dafuer zustaendig, beispielsweise eben den stdin-stream mit den
Tastatureingaben zu fuellen. Soweit bestens. Aber das tut so ein
Terminal nur zeilenweise nach bestaetigen mit Return. Demnach kann
man mit den stream-Geschichten nun mal beim besten Willen keine
solche return-lose Eingabe realisieren.
Statt dessen kann man aber was programmieren, was nicht ueber die
streams geht. Also direkt mit dem Terminal arbeitet.
Beispielsweise ncurses... kann da aber nicht aus eigener Erfahrung
reden, weil ich das noch nie selbst gemacht hab.
Aber mit sowas geht das zu machen.
</font><hr></pre></blockquote>
Re: direkte Eingaben von der Tastatur in C
Mein Compiler kennt die Funktion getch() nicht. Wie kann ich in C (nicht C++) ungepuffert ein Zeichen einlesen ?
-
- Posts: 85
- Joined: 24. Jan 2000 14:28
- Location: Nürnberg
Re: direkte Eingaben von der Tastatur in C
Wie schon gesagt: NCURSES!
Das getch, das du meinst,ist in der conio.h definiert, die es <b>nur unter DOS</b> gibt.
In den <b>NCURSES gibt es auch ein getch()</b>, das du benutzen mußt.
(Oder du freundest dich mit Slang an.)
gz. PsychoZapp
Das getch, das du meinst,ist in der conio.h definiert, die es <b>nur unter DOS</b> gibt.
In den <b>NCURSES gibt es auch ein getch()</b>, das du benutzen mußt.
(Oder du freundest dich mit Slang an.)
gz. PsychoZapp
Re: direkte Eingaben von der Tastatur in C
int getkey(void)
{
int taste;
taste=getch();
if (taste == 0 || taste == 224)
{
taste=getch()+255;
}
return taste;
}
das ist jetzt nur das Unterprogramm, aber wenn ich das Programm compiliere,
bekomme ich die folgenden Meldungen. Die curses.h habe ich aber angegeben.
Warum klappt das nicht ?
in function 'getkey':
undefined reference to 'stdscr'
undefined reference to 'wgetch'
undefined reference to 'stdscr'
undefined reference to 'wgetch'
{
int taste;
taste=getch();
if (taste == 0 || taste == 224)
{
taste=getch()+255;
}
return taste;
}
das ist jetzt nur das Unterprogramm, aber wenn ich das Programm compiliere,
bekomme ich die folgenden Meldungen. Die curses.h habe ich aber angegeben.
Warum klappt das nicht ?
in function 'getkey':
undefined reference to 'stdscr'
undefined reference to 'wgetch'
undefined reference to 'stdscr'
undefined reference to 'wgetch'
-
- Posts: 85
- Joined: 24. Jan 2000 14:28
- Location: Nürnberg
Re: direkte Eingaben von der Tastatur in C
Hi,
schein ein Linker Error zu sein.
(#include<?> vergessen bringt Compiler Errors)
Versuchs's mal mit -lncurses oder -lcurses.
Vielleicht geht's ja dann.
Was willst du überhaupt für eine Prog schreiben?
ciao PZ
schein ein Linker Error zu sein.
(#include<?> vergessen bringt Compiler Errors)
Versuchs's mal mit -lncurses oder -lcurses.
Vielleicht geht's ja dann.
Was willst du überhaupt für eine Prog schreiben?
ciao PZ
Re: direkte Eingaben von der Tastatur in C
Moin,
das mit -lcurses hat geklappt...nur wartet das Programm nicht auf einen Tastendruck, sondern gibt stumpf ein Zeichen aus. Ich hab' mal was mit drangehängt. Soll eigentlich nur ein stinknormaler Hexeditor werden...
/* gcc taste.c -otaste -lcurses */
#include <stdio.h>
#include <curses.h>
#include <ctype.h>
int getkey(void);
int main (void)
{
unsigned int taste=0;
while (taste!=27)
{
taste=getch();
printf("%c
",taste);
}
return 0;
}
das mit -lcurses hat geklappt...nur wartet das Programm nicht auf einen Tastendruck, sondern gibt stumpf ein Zeichen aus. Ich hab' mal was mit drangehängt. Soll eigentlich nur ein stinknormaler Hexeditor werden...
/* gcc taste.c -otaste -lcurses */
#include <stdio.h>
#include <curses.h>
#include <ctype.h>
int getkey(void);
int main (void)
{
unsigned int taste=0;
while (taste!=27)
{
taste=getch();
printf("%c
",taste);
}
return 0;
}
-
- Posts: 85
- Joined: 24. Jan 2000 14:28
- Location: Nürnberg
Re: direkte Eingaben von der Tastatur in C
Ein Segfault wäre ebenso wahrscheinlich gewesen.
Schreib' mal bevor du getch() usw. benutzt in den Code:
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr,TRUE);
Und zum Schluß:
endwin();
Ohne Initialisierung ist es klar, das nix geht. <img src="http://www.pro-linux.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
ciao und les' dir in Zukunft mal genauer durch was unter man curses kommt. <img src="http://www.pro-linux.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Schreib' mal bevor du getch() usw. benutzt in den Code:
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr,TRUE);
Und zum Schluß:
endwin();
Ohne Initialisierung ist es klar, das nix geht. <img src="http://www.pro-linux.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
ciao und les' dir in Zukunft mal genauer durch was unter man curses kommt. <img src="http://www.pro-linux.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
-
- Posts: 85
- Joined: 24. Jan 2000 14:28
- Location: Nürnberg
Re: direkte Eingaben von der Tastatur in C
Ich hab grad meine "Verbesserungen" ausprobiert.
Du solltest nicht printf verwenden, wenn du mit den curses arbeitest. addch() echochar() und refresh() sind dafür besser geeignet, sonst kriegst du den Bildschirmoutput ein bischen zu spät.
Hier ein Prog von mir:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include<curses.h>
/* INIT PROCEDURE */
void initscreen(void)
{
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr,TRUE);
}
/*-----------------------MAIN PROGRAM-------------------------*/
int main(void)
{
/* VARIABLES */
int ch;
char rch;
/* INITIAL */
initscreen();
/*-------------------------MAIN LOOP--------------------------*/
do {
ch=getch();
rch=ch;
printw("Sequence: %c Integer value: %i Char value: %i
",ch,ch,rch);
}
while (ch!='x');
/*-------------------------END OF PROG------------------------*/
endwin();
return 0;
}
</font><hr></pre></blockquote>
Du solltest nicht printf verwenden, wenn du mit den curses arbeitest. addch() echochar() und refresh() sind dafür besser geeignet, sonst kriegst du den Bildschirmoutput ein bischen zu spät.
Hier ein Prog von mir:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include<curses.h>
/* INIT PROCEDURE */
void initscreen(void)
{
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr,TRUE);
}
/*-----------------------MAIN PROGRAM-------------------------*/
int main(void)
{
/* VARIABLES */
int ch;
char rch;
/* INITIAL */
initscreen();
/*-------------------------MAIN LOOP--------------------------*/
do {
ch=getch();
rch=ch;
printw("Sequence: %c Integer value: %i Char value: %i
",ch,ch,rch);
}
while (ch!='x');
/*-------------------------END OF PROG------------------------*/
endwin();
return 0;
}
</font><hr></pre></blockquote>