PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastaturpuffer leeren



elch
17-05-2005, 11:52
moin,

ich hab da ein Problem mit dem Tastaturpuffer.
Bei einer Ausgabe soll das Problem kurz auf einen (beliebigen) Tastendruck warten, und dann erst weiterarbeiten. Das habe ich auch eigentlich problemlos mit getchar() lösen können. Vor diesem getchar() kommt nun aber eine Eingabe mit scanf() und danach hält das Programm nicht mehr bei getchar(). Ich denke, dass noch einige Zeichen im Tastaturpuffer festhängen.
Wie kann ich diesen nun löschen?
Ich habe es mit fflush( stdin ) bzw fflush( NULL ) probiert, aber beides funktioniert nicht.

[0x[90]|
17-05-2005, 13:57
Da kennt wohl jemand nicht Why fflush(stdin) is wrong ;)



#include <stdio.h>

int main(void)
{
int ch;
char buf[BUFSIZ];

puts("Flushing input");

while ((ch = getchar()) != '\n' && ch != EOF);

printf ("Enter some text: ");

if (fgets(buf, sizeof(buf), stdin))
{
printf ("You entered: %s", buf);
}

return 0;
}


Bye

elch
17-05-2005, 18:23
ich habe mal den relevanten Teil (while (...)) übernommen. Das Ganze funktioniert leider nicht :/
kann es sein, dass das mit meinem hin-und-herspringen zw. canonical und noncanonical-mode kollidiert?
wie gesagt, ich brauche das getchar() nur, um eine kurze Unterbrechung im Programmablauf zu erreichen. Sprich Tastendruck, und dann gehts weiter.

reset_input_mode();
while ( ( menu = getchar() ) != '\n' && menu != EOF );
set_input_mode();
getchar();

An dieser Stelle hakt es. Er leert wie mir scheint den Puffer, kommt dann allerdings nicht mehr aus der Schleife hinaus.

panzi
17-05-2005, 21:49
Achso, was du willst ist glaub ich getch() aus curses.h (-lcurses beim linken nicht vergessen).
Siehe: http://unixhelp.ed.ac.uk/CGI/man-cgi?ncurses

[0x[90]|
18-05-2005, 12:34
Err?? Wegen einer Funktion eine ganze Library mitlinken? Wow, nicht schlecht.

panzi
18-05-2005, 16:22
|']Err?? Wegen einer Funktion eine ganze Library mitlinken? Wow, nicht schlecht.
Diese lib verwendet sogar ls. Ohne diese lib geht, denk ich, praktisch kein linux-shell-app. curses ist das, was unter DOS conio war (und noch viel mehr). Jedenfalls ist's net groß.
Ein Freund hatte sich mal sein System zerschossen, weil er die lib gelöscht hatte. Wenn nichtmal ls geht, kannst praktisch nix mehr machen. Er konnte nur noch echo und cat verwenden, musste damit sein System reperieren!

[0x[90]|
18-05-2005, 18:11
Aha wirklich. Erstaunlich, das wusste ich nun nicht. Evtl. liegt es daran, dass mir ldd was anderes sagt :)



[devilx@xeno][~] ldd /bin/ls
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7fca000)
libacl.so.1 => /lib/libacl.so.1 (0xb7fc3000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e8e000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e7e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000)
libattr.so.1 => /lib/libattr.so.1 (0xb7e7a000)


//edit:



Er konnte nur noch echo und cat verwenden, musste damit sein System reperieren!


Denjenigen, der eine (wie du sagst) "ueberlebenswichtige" Library aus einem Linux System loescht und das ganze dann wieder nur mittels echo und cat repariert, vergoetter ich. :lol:

panzi
18-05-2005, 19:53
|']Aha wirklich. Erstaunlich, das wusste ich nun nicht. Evtl. liegt es daran, dass mir ldd was anderes sagt :)



[devilx@xeno][~] ldd /bin/ls
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7fca000)
libacl.so.1 => /lib/libacl.so.1 (0xb7fc3000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e8e000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e7e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000)
libattr.so.1 => /lib/libattr.so.1 (0xb7e7a000)


Nun, sein ls war definitif nach ls gelinkt. War irgendeine gentoo Version.


//edit:



Denjenigen, der eine (wie du sagst) "ueberlebenswichtige" Library aus einem Linux System loescht und das ganze dann wieder nur mittels echo und cat repariert, vergoetter ich. :lol:
ich glaub es ging so: echo als ls ersatz, einfach echo * und so.
Hab ihn nochmal gefragt: er konnte es so dann garnicht mehr reperieren, hat's mitn gentoo live system repariert.