OT: C/C++-Programmierung: wie liesst man ein einzelnes Zeichen ein
Hallo Linuxer, ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX! Ciao, Meini. -- Meinhard Schneider meini@meini.org; #ICQ:22574951 http://www.meini.org GNUPG/PGP-Keys available! (please contact me or visit my homepage) --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On Tue, Nov 14, 2000 at 08:00:25PM +0100, Meinhard Schneider wrote:
Hallo Linuxer,
Hallo Meinhard,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX!
Ich habe wenig Ahnung von C/C++, aber einzelne Zeichen würde ich mit getc/fgetc auslesen (in C). Vielleicht meinst Du etwas anderes, dann laß mich bitte nicht dumm sterben (als Anfänger finde ich gerade die Herangehensweise/Denke anderer interessant). mfG, Peter -- Play Rogue, visit exotic locations, meet strange creatures and kill them. --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, On Die, 14 Nov 2000, Meinhard Schneider wrote:
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst.
Hm. Wie dass bei der Tastatur geht weiss ich jetzt nicht, bei Dateien nehm ich get(). Abgewandelt auf die Standardeingabe geht z.B.: #include <iostream> int main(int argc, char *argv[]) { char in; in = cin.get(); cout << "Ein Zeichen: '" << in << "'\n"; return 0; } CU David --
So etwas habe Ich mir schon gedacht. aber da das zuendeführen dieses Gedanken mir zu anstrengend war, habe Ich an dieser Stelle aufgehöhrt zu denken. kannst Du Dich noch erinnern, wann etwa das war? Das Jahr würde schon reichen. [das Woko° und Cheatah in dag°]
--------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, die Tastatur ist doch auch so etwas wie eine Datei, und zwar die Standardeingabe. In C kannst Du zum Lesen eines Zeichens fgetc() verwenden. Grüße Helmut
Hallo,
On Die, 14 Nov 2000, Meinhard Schneider wrote:
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst.
Hm. Wie dass bei der Tastatur geht weiss ich jetzt nicht, bei Dateien nehm ich get(). Abgewandelt auf die Standardeingabe geht z.B.:
#include <iostream>
int main(int argc, char *argv[]) { char in; in = cin.get(); cout << "Ein Zeichen: '" << in << "'\n"; return 0; }
CU David
--------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Helmut Herrmann wrote:
Hallo,
die Tastatur ist doch auch so etwas wie eine Datei, und zwar die Standardeingabe. In C kannst Du zum Lesen eines Zeichens fgetc() verwenden.
Grüße Helmut
Hallo,
On Die, 14 Nov 2000, Meinhard Schneider wrote:
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst.
Hm. Wie dass bei der Tastatur geht weiss ich jetzt nicht, bei Dateien nehm ich get(). Abgewandelt auf die Standardeingabe geht z.B.:
#include <iostream>
int main(int argc, char *argv[]) { char in; in = cin.get(); cout << "Ein Zeichen: '" << in << "'\n"; return 0; }
Gibt es hier niemanden, der C/C++ programmiert? Hätte gedacht, daß es hier total die fähigen Leute gibt, in der Hinsicht. Naja. Falls die bisherigen Antworten nicht zufriedenstellend waren, beantworte ich gerne jede Frage spät am Abend. Irgendwie war die Frage auch ein bisschen undeutlich. Du möchtest ein C-Programm schreiben und weisst nicht, wie man von der Standardeingabe liest? Dann noch viel Spass... MfG Marc Mc Guinness -- "Never surf faster, than your guardian penguin can fly!" ICQ: # 86484697 TUX: # 194207 http://www.mcguinness.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, On Mit, 15 Nov 2000, Helmut Herrmann wrote: Bitte schreibe unter das zitierte. Danke. [TOFU korrigierend]
On Die, 14 Nov 2000, Meinhard Schneider wrote:
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst.
Hm. Wie dass bei der Tastatur geht weiss ich jetzt nicht, bei Dateien nehm ich get(). Abgewandelt auf die Standardeingabe geht z.B.:
#include <iostream>
int main(int argc, char *argv[]) { char in; in = cin.get(); cout << "Ein Zeichen: '" << in << "'\n"; return 0; }
die Tastatur ist doch auch so etwas wie eine Datei,
Nicht nur 'so etwas wie' sondern 'ist'. Was ich ja implizit schrieb... Allerdings kenne ich das Verhalten in Bezug auf .eof() usw. nicht, daher wollte ich nur eine Anregung bringen.
und zwar die Standardeingabe. In C kannst Du zum Lesen eines Zeichens fgetc() verwenden.
Stimmt. Aber, ahem, du hast dir obigen (getesteten!) C++ code angeschaut oder gestestet? Rat mal was cin.get() macht... CU David, *kopfschuettelnd* -- "Wenn sich bei manchen nur so schnell der Kopf mit Verstand füllen würde, wie diese gabeln mit meinen Siggs, dann gäbe es hier viel weniger Daus." [das Woko° in dag°] --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Meinhard Schneider wrote:
Hallo Linuxer,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX!
<unvollstaendig> #include <ncurses.h> int main(void) { SCREEN *myterm; initscr(); cbreak(); myterm=newterm("concolse",stdout,stdin); flushinp(); addstr("press any key\n"); getch(); endwin(); return 0; } </unvollstaendig> Gruß, daniel -- may the source be with you --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Linuxer,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX!
Auf die bisher eingegangenen Antworten möchte ich nicht eingehen. Ich habe den Eindruck, dass sie noch nicht wirklich versucht haben über ein Terminal 1 einzelnes Zeichen einzulesen. Wir haben das Problem, dass wir nur ein Cursor-Tastendruck auslesen wollen. Das funktioniert allerdings so nicht, da die getty's nicht so konfiguriert sind. Ich kann auch nur soviel dazu sagen, dass es da einen kanonischen und einen nicht-kanonischen Modus gibt. Im einen Fall gibt wird gewartet, bis ein CR kommt und dann alles an das aufrufende Programm gesendet und im anderen Fall wird jedes Zeichen wirklich einzeln geschickt. kuck mal, ob Du in den man-pages was über kanonisch und nicht- kanonisch findest. Leider kann ich Dir zur Zeit nicht sonderlich weiterhelfen. Das Problem ist bei uns auch noch nicht gelöst. Ausserdem finde ich gerade meine Unterlagen darüber nicht. :-( Gruss Joachim -- joachim.hussong@dlr.de joachim.hussong@gmx.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Meinhard Schneider wrote:
Hallo Linuxer,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX!
Hi, muss es C sein? Sonst: #! /usr/bin/perl system("/bin/stty cbreak < /dev/tty"); open(IN, "< /dev/tty"); $keypressed=getc(IN); close IN; system("/bin/stty cbreak < /dev/tty"); print $keypressed Vielleicht auch eine Anregung fuer C ... tty cbreak laesst sich auch mit bash --> read nutzen. -- o long... bernd ------------------------------------------------------------------------ --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, * Meinhard Schneider <meini@meini.org> [001114 20:00]:
Hallo Linuxer,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX! in C++:
/*-----------------------------------------------------------*/ #include <iostream.h> // cin, cout void main() { int eingabewert; //Eingabe ist ein ganzzahliger Wert cout << "Geben sie eine ganze Zahl zwischen 1 und 10 ein\n" "und schliessen Sie Ihre Eingabe mit <Enter> ab: "; cout >> entry; //Wert einlesen cout << "\nDie eingegeben Zahl war: " << eingabewert; } /+-----------------------------------------------------------*/ Fuer ein einzelnes Zeichen kannst Du folgendes benutzen: char buchstabe; buchstabe = cin.get(); bye bruno --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo,
Fuer ein einzelnes Zeichen kannst Du folgendes benutzen:
char buchstabe; buchstabe = cin.get(); Nö!
Das funktioniert nur vielleicht bei einer Dose. Unter Linux/Unix, nur dann, wenn eine Zeile eingegeben wird und Du die dann Buchstabenweise auslesen willst. Wenn man einen Prompt programmieren will, d.h man tippt eine Taste und der Buchstabe soll direkt bearbeitet werden, ohne, dass ein CR gedrückt sein soll, dann gibt es mit der Standard- Konfiguration Probleme. Dein Programm merkt erst, dass eine Eingabe vorliegt, wenn die Eingabe mit einem CR beendet wurde. Um das zu umgehen muss man an den Parametern der Terminals rumbasteln. iehe termios.h etc. Der Vorschlag von Daniel Wolpert trägt diesem Rechnung! Gruss Joachim -- joachim.hussong@dlr.de joachim.hussong@gmx.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On Wed, 15 Nov 2000, Joachim Hussong wrote: ... man stty: cbreak modus setzen stty cbreak >/dev/tty1 oder in C die curses einlinken #include curses.h und newterm("dein_terminalname_wie_in_termcap",stdout,stdin); raw();cbreak();noecho(); aufrufen, siehe auch die Optionen von stty -- may the tux be with You! Joerg Thuemmler sysadmin@vordruckleitverlag.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
struct termios termios, tmp; int c; tcgetattr(0, &termios); tmp=termios; tmp.c_iflag|=IUCLC; tmp.c_lflag&=~(ICANON|ECHO); tmp.c_cc[VMIN]=1; tmp.c_cc[VTIME]=0; tcsetattr(0, TCSANOW, &tmp); c=getchar(); tcsetattr (0, TCSANOW, &termios); -- _, Regards, (_ ,_)ven Hansen. +-------------------------------------------------------+ | Sven Hansen Celo Communications GmbH | | Dipl.-Chem. Weissenfelser Strasse 46a | | Senior Software Engineer D-06217 Merseburg | | mailto:sh@celocom.de http://www.celocom.de | | Phone: +49 (0)3461/3318-24 Fax: +49 (0)3461/415072 | +-------------------------------------------------------+ Unix _IS_ user friendly - it's just selective about who its friends are ! <HR> <UL> <LI>application/x-pkcs7-signature attachment: smime.p7s </UL> --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Liste, Wir haben uns einen Server gekauft und alles zum laufen gebracht. DAss ist ja nicht sooo schwer ;-) nein mein problem besteht dass ich nicht auf dass "veraltete" POP3 sondern auf IMAP4 zurückgreifen will! 1. Was brauche ich dazu? 2. Was giebt es (alle möglichkeiten)? 3. Was ist so gut wie kostenlos? Danke im vorraus Markus --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
nein mein problem besteht dass ich nicht auf dass "veraltete" POP3 sondern auf IMAP4 zurückgreifen will! 1. Was brauche ich dazu? 2. Was giebt es (alle möglichkeiten)? 3. Was ist so gut wie kostenlos?
Das positive an IMAP ist IMHO, daß man die Mails von unterschiedlichen Clients aus lesen kann. Das negative dagegen, die ungewohnte Bedienung -- so liegen z.B. bei StarOffice als Client die gelöschten Mails im Papierkorb des Office-Pakets *UND* immer noch auf dem Server. Erst wenn der Papierkorb geleert wird, verschwinden die Mails vom Server. Kann also (je nach Netzwerk) Zusatzkosten verursachen. Die Bedienung ist schon reichlich gewöhnungsbedürftig. Dafür hat man aber auch mehr Möglichkeiten; man kann "Ordner abonieren". Hab's noch nicht ausprobiert, klingt aber ein bißchen wie Mailingliste ... Problematisch ist meiner Meinung nach (sozusagen "IMHO"), daß die User ihre Mails nicht löschen und Deine var-Partition zumüllen. Und wenn man dann die User bittet, alte Mails zu löschen, werden die auch den Horror kriegen, wenn sie sich durch hunderte von alten Mails kämpfen müssen. Ich plädiere gerne für POP (besser wäre APOP, aber das kann Rausguck nicht!), weil es einfach klare Verhältnisse schafft :-) Carsten --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
* Joerg Thuemmler (jthuemmler@vordruckleitverlag.de) [20001115 15:02]:
raw();cbreak();noecho(); aufrufen, siehe auch die Optionen von stty
Mit raw() wirst du dir aber evtl. ziemlich in den Fuss schiessen :) Mach' das mal auf einem seriellen Terminal, welches Software-Handshake, also XON/XOFF verwendet und schon hast du einen prima Salat, weil mit raw() auch diese Steuersequenzen nicht mehr interpretiert werden. Daher ist cbreak() meist die richtige Wahl. Aber generell ist es immer wieder verwunderlich, wie viele Programmierer zu vergessen scheinen, dass sie es mit einer UNIX-Variante zu tun haben und daher eine intensivere Beschäftigung zumindest mit terminfo (und ggfs. curses) nötig ist. Aber ich gebe zu, dass das Ganze auch für mich zunächst sehr fremd war, als ich vor ca. acht Jahren zuerst damit zu tun hatte. Philipp -- Penguins shall save the dinosaurs -- Handelsblatt about Linux on S/390 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Meinhard Schneider wrote:
Hallo Linuxer,
ich weiss, dass ich ein *bisschen* OT bin, aber ich probiers trotzdem: ich brauche ein C/C++-Programm, dass einzelne Zeichen von der Tastatur einliesst. Dazu muss man irgendwie den Tastaturbuffer ausschalten. Ich habe gehört, dass man das irgendwie mit (n)curses machen kann. Kann mit vielleicht jemand ein kleines Beispiel dafür schicken?! mny THX!
wie waer's damit ? #include <sys/poll.h> #include <termios.h> #include <unistd.h> #include <string.h> #include <errno.h> int main(void) { int res; struct pollfd event; struct termios old_t, new_t; event.fd = 0; event.events = POLLIN; event.revents = POLLIN; if ( tcgetattr(0, &old_t) == -1 ) { perror("tcgetattr() failed"); return 1; } memcpy(&new_t, &old_t, sizeof(struct termios)); tcflush(0,TCIFLUSH); cfmakeraw(&new_t); if ( tcsetattr(0,TCSANOW, &new_t) == -1 ) { perror("tcsetattr() failed"); return 1; } if ( (res=poll(&event,1,1000)) == 0 ) { printf("where is every body gone?\n"); } tcsetattr(0,TCSANOW, &old_t); return 0; } daniel -- --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, vielen Dank für die Zahlreichen Antworten. Ich habe das Problem inzwischen gelöst. get() oder getc() nützen nichts. Zwar kann man mit getc die Zeichen einzeln einlesen, aber erst nachdem sie aus dem Tastaturbuffer raus sind (ENTER gedrückt). Man muss nur irgend so eine vga... .h includen, dann kann man das keyboard auf raw stellen. Das Programm funktioniert soweit, aber trotzdem vielen Dank! Ciao, Meini. -- Meinhard Schneider meini@meini.org; #ICQ:22574951 http://www.meini.org GNUPG/PGP-Keys available! (please contact me or visit my homepage) --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
* Meinhard Schneider (meini@meini.org) [20001115 18:01]:
Tastaturbuffer raus sind (ENTER gedrückt). Man muss nur irgend so eine vga... .h includen, dann kann man das keyboard auf raw stellen.
Was nicht der richtige Weg ist, da dies komplett unportabel ist. Sobald du mal ein Terminal an deinen Rechner hängst versagt dir das Programm den Dienst :( Der korrekte Weg ist beschrieben worden: Terminal in cbreak Modus setzten und dann ein einzelnes Zeichen lesen. Wo ist da das Problem? Es sei denn, du willst PC spezifische Tasten abfragen. Philipp -- Philipp Thomas <pthomas@suse.de> Development, SuSE GmbH, Schanzaecker Str. 10, D-90443 Nuremberg, Germany Penguins shall save the dinosaurs -- Handelsblatt about Linux on S/390 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (14)
-
bsemrau@t-online.de
-
cmeyer@mail.com
-
david@dhaller.de
-
dw@siebel.de
-
Helmut.Herrmann@aeon.de
-
Illuminatus@t-online.de
-
joachim.hussong@dlr.de
-
jthuemmler@vordruckleitverlag.de
-
mc_guinness@gmx.de
-
meini@meini.org
-
PSchneewind@t-online.de
-
pthomas@suse.de
-
sh@celocom.de
-
suse-linux@homepage-man.de