如何清空键盘输入的缓冲区?

wurong 2000-05-18 02:46:00
c语言中
想清空键盘输入的缓冲区,如何作?(在linux,unix下)

如:
char buf[64];
read(STDIN_FILNO,buf,4);
write(STDOUT_FILENO,buf,4);

read(STDIN_FILENO,buf,4);
write(STDOUT_FILENO,buf,4);

如果第一次read时键盘敲了大于4的字符,则第二个read直接从键盘的输入缓冲区
读入,而不是从控制台读入。所以我想在第二个read前清空键盘输入的缓冲区,
如何办?

谢了,先
...全文
1124 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixiande 2000-06-24
  • 打赏
  • 举报
回复
一句话就解决问题:
#include <bios.h>
while(bioskey(1)) bioskey(0);
SCUM 2000-06-24
  • 打赏
  • 举报
回复
最好的结局是:

将buf清空。
...
memset(buf,0,BUF_LEN);
fgets(buf,64,stdin);
...

mach 2000-06-04
  • 打赏
  • 举报
回复
read本身已经是不带缓冲的了(相对于fgets),你这里所说的缓冲可能是bios中的吧,要想在unix下操纵它,恐怕够难的,不知道那位大虾有好办法
halfdream 2000-06-04
  • 打赏
  • 举报
回复
SORRY, 我犯了一个不该犯的错误,
REWIND 是把文件当前位置指针移到开头, 这样当然不行.
一个有点可笑的答案:
在中间加一句
fgets(buf,64,stdin); //用它把多的字符串读干净.
然后再 fread(buf,4,1,stdin);
.....
wurong 2000-06-03
  • 打赏
  • 举报
回复
先谢各位,
我用rewind试了一下,
程序的fgets(),仍是得到相同的输入,并不能清空.

我在linux下的程序,故最好用系统的函数,不用bios之类的调用.
K 2000-06-02
  • 打赏
  • 举报
回复
rewind
qutemouse 2000-06-02
  • 打赏
  • 举报
回复
令BIOS数据区中,指向键盘缓冲区(一队列)的首尾指针置相同的值,首指针为40:1A尾指针为40:1C。
flyingknight 2000-05-29
  • 打赏
  • 举报
回复
补充一下...在bios数据区中偏移量01aH中存放键盘缓冲区首地址
在偏移量01cH中存放键盘缓冲区尾地址
在偏移量01eH开始的32字节内存中,是真正的键盘缓冲区。
bios数据区首地址好像在实模式0040:0000H,保护模式线性地址00000400(我也不太记得了)
flyingknight 2000-05-29
  • 打赏
  • 举报
回复
无论在什么操作系统中,只要找到键盘缓冲区,将首尾指针都指向缓冲区中同一个地址就可以了
sunruijia 2000-05-28
  • 打赏
  • 举报
回复
void clrkey()
{
union REGS r;
r.h.ah=0x0c;
intdos(&r,&r);
}
用TC2.0编写以上代码即可.
springsea 2000-05-26
  • 打赏
  • 举报
回复
同意halfdream,
不过既然叫缓冲区,是不是有这样的函数,流式读入即实现读入就
清除被读字符!
halfdream 2000-05-26
  • 打赏
  • 举报
回复
哈,我在Linux 下试过了,我最先的猜想倒还是对了,
GNU C 下面倒同样有标准IO库, 只是函数声明有时大同小异。
没错, 就是用rewind(STDIN_FILENO). 至于它具体清了什么缓冲,
怎么清的就用不着管了。
halfdream 2000-05-22
  • 打赏
  • 举报
回复
duhaohao, 在DOS下你的方法确实有用,但在Linux下怎么会有DOS中断让你调用呢?
其实严格来说,wurong 所需要的,并不是清键盘缓冲区,而是清输入流(文件)缓冲。
halfdream 2000-05-22
  • 打赏
  • 举报
回复
duhaohao,你在方法在DOS下确实有用,但在Linux下怎么会有DOS中断让你调用呢?其实这个问题严格来说,不是清键盘缓冲区的问题。
王释之 2000-05-22
  • 打赏
  • 举报
回复
是不是有reflush等这样的函数。
duhaohao 2000-05-21
  • 打赏
  • 举报
回复

void clrkey()
{
union REGS in ;
in.h.ah = 0x0c ;
in.h.al = 0x00 ;
intdos(&in , &in) ;
}
halfdream 2000-05-19
  • 打赏
  • 举报
回复
根据我的理解,胡乱猜一下,多半有这样的函数:
rewind(STDIN_FILENO);
在WIN98中的提示行状态下,我用BCB4试了一下, 应该是可行的。
#include<stdio.h>
void main()
{
char buf[64];
fread(buf,4,1,stdin);
fwrite(buf,4,1,stdout);
rewind(stdin);
fread(buf,4,1,stdin);
fwrite(buf,4,1,stdout);

}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧