Einlesen von der Konsole
-
Diamond, ja nachher geht das... aber wenn du das \n überschreiben willst ist es ja schon zu spät. scanf liefert dann nämlich nur das erste wort. Also bisschen dämlich.
-
und irgendwelche vorschläge zu 2.) ???
-
in der llibc fällt mir da nix zu ein aber ncurses hat dazu die funktion getch(), die du zusammen mit cbreak() nutzen kannst dann sollte das laut manual gehn
-
hab eben noch mal die libc durchwühlt und was über low-level terminal interface oder so gefunden.
http://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-Terminal-Interface.html#Low_002dLevel-Terminal-Interfaceschaut alles recht kompliziert aus, von daher doch lieber eine schon fertige lösung wie ncurses. wenn du nur nen weg suchst, dass du quasi nen prompt willst, solltest du mal libtecla dir anschauen is recht einfach gehalten, hat aber recht nette features (history, completion, editing ua)
http://www.astro.caltech.edu/~mcs/tecla/index.html
ich benutz die selber und muss sagen für meine zwecke mehr als genug
-
ja ich hätte nur am liebsten eine ansi c lösung. Vor allem weil es plattformübergreifend verwendbar sein soll.
-
ansi c garantiert dir weder zeilengepufferte noch ungepufferte eingabe.
begnuege dich mit getchar(), den genannten ansi c loesungen oder zusatzlibraries.
-
Hallo,
hmm, mit dieser ungepufferten Geschichte.
Gibt es nicht die Möglichkeit, irgendwie direkt
den Tastaturpuffer auszulesen?
Das klappte ja schon damals beim C64.Bs,
DC
-
Hmm.. ob es nun ANSI-C ist, weiß ich nicht, aber
das hier funktioniert:#include <stdio.h> #include <conio.h> main() { char txt[20]; int a; for (a=0;a<10;a++) { txt[a]=getch(); printf("%c",txt[a]); } printf("%s\n",txt); }
Gruß,
DCJoo, hab gerade nachgelesen, daß es nicht Ansi ist und auch
Systemabhängig.
naja, aber trotzdem ne feine Sache..
-
ansi c ist nicht c64. direkt auf den tastaturpuffer zugreifen kannst du unter windows oder unix wohl eher nicht.
such dir ein OS raus, dann sieh, ob du in der faq fuendig wirst.
-
Ne das ganze soll schon plattformübergreifend sein. Also gibt es da keine Möglichkeit ausser eine fremde lib zu verwenden?
-
sag ich doch.
-
Hat der Moderator immer recht?
-
noe. aber mit ansi c bekommst du keine pufferung oder nichtpufferung garantiert. also solltest du darauf auch nicht bauen. wenn du schon text-guis bastelst, dann nimm auch libraries, die darauf spezialisiert sind (ncurses, improved console, ...)
-
Es geht ja nicht um ne textgui. Es geht im Prinzip darum ( wie beim Telnet ) das was beim Server eingegeben wurde auf den client zu übertragen. Einen Echo-Server haben wir schon laufen, allerdings wird da die nachricht logischerweise erst gesendet, wenn enter gedrückt wird. Wir wollen das jetzt auf jedes Zeichen erweitern.
-
ein telnet client uebertraegt ungepuffert.
-
ja und wie kriege ich das hin? Ich kriege ja die eingabe nicht einmal ungepuffert hin. Das ist ja das Problem.
-
wie gesagt, ein telnet client sendet ungepuffert. das macht der mit API calls. (edit: oder auch nicht, alles ist relativ...)
dein (tcp?) server bekommt vom telnet client im normalfall einzelne zeichen sofort zugeschickt.
edit: lol, hier lernt man nie aus:
http://www-ccs.ucsd.edu/c/stdio.html#setvbufviele terminals sind aber weiterhin zeilengepuffert. das kannst du dann wirklich nur mit API calls beeinflussen.
-
Das Problem liegt doch nicht am Socket. Es liegt einfach daran das ich die Zeichen ( die eingegeben wurden und die ich erst bekomme nach dem ich enter drücke ) zu spät bekomme. Ich will die Zeichen auf dem Server ( bzw. auf der anderen Seite ) auch schon sehen, wenn ich sie eingebe, aber noch nicht mit Enter oder Return bestätigt habe.
-
ich sag es doch schon die ganze zeit:
die pufferung kannst du nicht mit ansi c beeinflussen, wenn sie durch das terminal verursacht wird.
benutze API calls oder irgendwelche libraries und finde dich damit ab.
-
Was denn für API calls? Also ich habe gerade versucht die funktion setvbuf zu benutzen. Angeblich kann man damit ja ungepuffert lesen, wenn man IONBF mitgibt. Allerdings kennt er dieses define nicht einmal.
Ist die Seite noch aktuell?