C++非阻塞键盘缓冲区输入检测或读取函数是什么?
C++非阻塞键盘缓冲区输入检测或读取函数是什么?我的程序是想如果键盘缓冲区不存在字符则跳过继续执行,而不是阻塞等待,应该如何实现?kbhit能不能检测缓冲区输入?...
C++非阻塞键盘缓冲区输入检测或读取函数是什么?
我的程序是想如果键盘缓冲区不存在字符则跳过继续执行,而不是阻塞等待,应该如何实现?
kbhit能不能检测缓冲区输入? 展开
我的程序是想如果键盘缓冲区不存在字符则跳过继续执行,而不是阻塞等待,应该如何实现?
kbhit能不能检测缓冲区输入? 展开
3个回答
展开全部
如果是linux的话可以将输入设备设置为非阻塞模式就可以了,用 fcntl 函数:
fcntl( 0, F_SETFL, O_NONBLOCK);
在windows上好像没有这个函数,不知道 DeviceIoControl 函数有没有这个功能,如果没有的话可以构造一个线程去读标准输入,1秒钟内无响应就继续执行,伪代码如下:
Event e;
char chr;
DWORD WINAPI ReadStdin( void ){
//读标准输入
}
void CheckStdIn( void ){
WaitEvent( e ); //阻塞,当主线程有需求时才读
chr= 0;
CreateThread( ReadStdin );
WaitThread; //等1秒(或更短)
}
void main(){
loop = 100;
while( 0 < loop--){
CheckStdIn();
if ( chr ==0 ){
//no input
} else {
//get input
}
}
}
fcntl( 0, F_SETFL, O_NONBLOCK);
在windows上好像没有这个函数,不知道 DeviceIoControl 函数有没有这个功能,如果没有的话可以构造一个线程去读标准输入,1秒钟内无响应就继续执行,伪代码如下:
Event e;
char chr;
DWORD WINAPI ReadStdin( void ){
//读标准输入
}
void CheckStdIn( void ){
WaitEvent( e ); //阻塞,当主线程有需求时才读
chr= 0;
CreateThread( ReadStdin );
WaitThread; //等1秒(或更短)
}
void main(){
loop = 100;
while( 0 < loop--){
CheckStdIn();
if ( chr ==0 ){
//no input
} else {
//get input
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//按下y键退出
#include<stdio.h>
#include<conio.h>
int main()
{
while(1)
{
if(_kbhit() &&'y'==_getch())
{
break;
}
}
}
仅供参考
#include<stdio.h>
#include<conio.h>
int main()
{
while(1)
{
if(_kbhit() &&'y'==_getch())
{
break;
}
}
}
仅供参考
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、“打开”文件的含义:以某中方式从磁盘上查找指定的文件或创建一个新文件。
2、size_t fread(void *buffer, size_t size, size_t count, FILE *fp):从文件fp中读入count次
,每次读size字节,读入的信息存在buffer指针指向的缓冲区。函数返回值等于实际读入的次数(可能少于
count)。
size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp):将buffer地址开始
的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。
3、
int fputc(int c, FILE *fp)----把字符c写入文件fp,成功时返回字符c的ASCII码,失败时返回
EOF(在stdio.h中,符号常量EOF的值等于-1)。
----从文件fp中读一个字符,返回读得的字符。
对于文本文件,遇文件尾时返回EOF。
对于二进制文件,用feof(fp) 判别是否遇文件尾。feof(fp)=1说明遇文件尾。
4、fscanf函数和fprintf函数
(1)、fscanf函数fscanf函数只能从文本文件中按格式输入。fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件中的数据。函数的调用形式如下:例如,若文件指针fp已指向一个已打开的文本文件,a、b分别为整型变量,则以下语句从fp所指的文件中读入两个整数放入变量a和b中:fscanf(fp, "%d%d",&a,&b);注意:文件中的两个整数之间用空格(或跳格符、回车符)隔开。语句:fscanf(stdin,"%d%d",&a,&b);等价于:scanf("%d%d",&a,&b);因为文件名stdin就是代表终端键盘。
(2)、fprintf函数fprintf函数按格式,并以ASCⅡ代码形式输出到文本文件中。fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中。函数的调用形式如下:fprintf(文件指针,格式控制字符串,输出项表)例如,若文件指针fp已指向一个已打开的文本文件,x,y分别为整型变量,则以下语句将把x和y两个整型变量中的整数按%d格式输出到fp所指的文件中:fprintf(fp,“%d %d”,x,y);注意:为了以后便于读入,两个数之间应当用空格隔开。同时也是为了便于读入,最好不要输出附加的其他字符串。以下语句:fprintf(stdout,“%d %d”,x,y);等价于:printf(”%d %d”,x,y);因为文件名stdout就是代表终端屏幕。
5、其他读写函数
int putw(int w, FILE *fp)
int getw(FILE *fp)
char * fgets(char *str, int n, FILE *fp)
int fputs(const char *str, FILE *fp)
2、size_t fread(void *buffer, size_t size, size_t count, FILE *fp):从文件fp中读入count次
,每次读size字节,读入的信息存在buffer指针指向的缓冲区。函数返回值等于实际读入的次数(可能少于
count)。
size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp):将buffer地址开始
的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。
3、
int fputc(int c, FILE *fp)----把字符c写入文件fp,成功时返回字符c的ASCII码,失败时返回
EOF(在stdio.h中,符号常量EOF的值等于-1)。
----从文件fp中读一个字符,返回读得的字符。
对于文本文件,遇文件尾时返回EOF。
对于二进制文件,用feof(fp) 判别是否遇文件尾。feof(fp)=1说明遇文件尾。
4、fscanf函数和fprintf函数
(1)、fscanf函数fscanf函数只能从文本文件中按格式输入。fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件中的数据。函数的调用形式如下:例如,若文件指针fp已指向一个已打开的文本文件,a、b分别为整型变量,则以下语句从fp所指的文件中读入两个整数放入变量a和b中:fscanf(fp, "%d%d",&a,&b);注意:文件中的两个整数之间用空格(或跳格符、回车符)隔开。语句:fscanf(stdin,"%d%d",&a,&b);等价于:scanf("%d%d",&a,&b);因为文件名stdin就是代表终端键盘。
(2)、fprintf函数fprintf函数按格式,并以ASCⅡ代码形式输出到文本文件中。fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中。函数的调用形式如下:fprintf(文件指针,格式控制字符串,输出项表)例如,若文件指针fp已指向一个已打开的文本文件,x,y分别为整型变量,则以下语句将把x和y两个整型变量中的整数按%d格式输出到fp所指的文件中:fprintf(fp,“%d %d”,x,y);注意:为了以后便于读入,两个数之间应当用空格隔开。同时也是为了便于读入,最好不要输出附加的其他字符串。以下语句:fprintf(stdout,“%d %d”,x,y);等价于:printf(”%d %d”,x,y);因为文件名stdout就是代表终端屏幕。
5、其他读写函数
int putw(int w, FILE *fp)
int getw(FILE *fp)
char * fgets(char *str, int n, FILE *fp)
int fputs(const char *str, FILE *fp)
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询