Einlesen von der Konsole
-
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?
-
Das Makro heisst laut meiner Manpage _IONBF und setvbuf gilt wohl nur für _Output_-_Streams_.
-
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).