C++ 如何判断cin流是否为空
示例:///////////////////////////////////START//////////////////////////////////////////...
示例:
///////////////////////////////////START/////////////////////////////////////////////
#include <Windows.h>
......................
string Text = "qwertyuiopasdfghjkl;zxcvbnm";
for(int i = 0;i < Text.size();++i)
{
cout << Text[i];
Sleep(30);//暂停30毫秒
if(/*cin流不为空*/)
{
system("cls");//清空屏幕
cout << Text;
break:
}
cin.clear();//清空cin流
}
.......................
///////////////////////////////////////END////////////////////////////////////////
就是想把Text一个个字符地输出来,中途如果输入了任何按键就清空屏幕,并立即把Text全部输出来 展开
///////////////////////////////////START/////////////////////////////////////////////
#include <Windows.h>
......................
string Text = "qwertyuiopasdfghjkl;zxcvbnm";
for(int i = 0;i < Text.size();++i)
{
cout << Text[i];
Sleep(30);//暂停30毫秒
if(/*cin流不为空*/)
{
system("cls");//清空屏幕
cout << Text;
break:
}
cin.clear();//清空cin流
}
.......................
///////////////////////////////////////END////////////////////////////////////////
就是想把Text一个个字符地输出来,中途如果输入了任何按键就清空屏幕,并立即把Text全部输出来 展开
5个回答
2013-03-22
展开全部
我可能不能给你解决方案.
但是可以告诉你几种不可能解决问题的被推荐做法.
if( cin ) // 判断输入流是否为空
cin并不是实时监控你的键盘消息,只有你执行if( cin )的时候,它才会特地挂起程序,接受键盘消息.
也就是之前按了什么都不会被cin接受
readsome() // 消耗缓冲区中的字节
readsome()更不可能解决,因为它保存的是你一次cin读取下来没有完全消化掉的字节,
cin.rdbuf()->in_avail()是readsome()的下层函数,它们真正的工作函数是basic_streambuf<>::showmanyc()
// win32 控制程序台程序
main() ...
MSG msg ;
if( GetMessage( NULL, &msg, NULL, NULL ) )
{
msg.Message == WM_KEYDOWN ; // 只要是按键消息,不管哪个窗口,都拦截下来
// do what you have to do
}
仍然不行.因为你的程序是寄生在cmd.exe里面执行的,你在cmd上按了键盘不会有消息到你的消息队列.哪怕是你使用win32窗口程序,也不行,同样的道理:
int CALLBACK WinMain( ... )
{
AllocConsole() ;
ofstream cout ;
cout.open( "con" ) ;
cout << "jackheroes" << endl ;
MSG msg ;
while( GetMessage( &msg, 0, 0, 0 ) )
{
cout << msg.hwnd << endl ; // 不可能打印出按键消息
DispatchMessage( &msg ) ;
TranslateMessage( &msg ) ;
}
}
其实不是你的问题难解决的问题,而是你的问题本身太模糊.
因为你在使用控制台作为打印消息.而控制台本身不属于你的线程,
你拦截不到对它的按键消息.
而cin设计的初衷是"输入数据", 而不是"监视按键消息"
所以你的问题只是看上去很简单而已.
钩子,当然可以解决你的问题.但是不值这种费力.
如果一定要做,可以看下这个帖子. 找住控制台窗口的句柄就行了.
http://zhidao.baidu.com/question/533683290?&oldq=1
改变设计是最简单的方法.
但是可以告诉你几种不可能解决问题的被推荐做法.
if( cin ) // 判断输入流是否为空
cin并不是实时监控你的键盘消息,只有你执行if( cin )的时候,它才会特地挂起程序,接受键盘消息.
也就是之前按了什么都不会被cin接受
readsome() // 消耗缓冲区中的字节
readsome()更不可能解决,因为它保存的是你一次cin读取下来没有完全消化掉的字节,
cin.rdbuf()->in_avail()是readsome()的下层函数,它们真正的工作函数是basic_streambuf<>::showmanyc()
// win32 控制程序台程序
main() ...
MSG msg ;
if( GetMessage( NULL, &msg, NULL, NULL ) )
{
msg.Message == WM_KEYDOWN ; // 只要是按键消息,不管哪个窗口,都拦截下来
// do what you have to do
}
仍然不行.因为你的程序是寄生在cmd.exe里面执行的,你在cmd上按了键盘不会有消息到你的消息队列.哪怕是你使用win32窗口程序,也不行,同样的道理:
int CALLBACK WinMain( ... )
{
AllocConsole() ;
ofstream cout ;
cout.open( "con" ) ;
cout << "jackheroes" << endl ;
MSG msg ;
while( GetMessage( &msg, 0, 0, 0 ) )
{
cout << msg.hwnd << endl ; // 不可能打印出按键消息
DispatchMessage( &msg ) ;
TranslateMessage( &msg ) ;
}
}
其实不是你的问题难解决的问题,而是你的问题本身太模糊.
因为你在使用控制台作为打印消息.而控制台本身不属于你的线程,
你拦截不到对它的按键消息.
而cin设计的初衷是"输入数据", 而不是"监视按键消息"
所以你的问题只是看上去很简单而已.
钩子,当然可以解决你的问题.但是不值这种费力.
如果一定要做,可以看下这个帖子. 找住控制台窗口的句柄就行了.
http://zhidao.baidu.com/question/533683290?&oldq=1
改变设计是最简单的方法.
追问
嗯. . .谢谢你打这么多哈。我还没进入windows编程,不过谢谢你!
展开全部
判断代码如下:
char temp;
if(/*cin流不为空*/temp=cin.getchar())
{
system("cls");//清空屏幕
cout << Text;
break:
}
cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。需要注意保证从流中读取数据能正常运行。
例如:
int a,b;
cin>>a>>b;
若从键盘中输入:21 abc 回车
变量a从输入流中提取整数21,提取操作成功,此时cin流出于正常状态。cin跳过读取空格,读取下一段缓冲区,但在变量b准备提取一个整数时,遇到了字母a,显然提取操作失败了,此时,cin流被置为出错状态。
只有在正常状态,才能从输入流中提取数据。
char temp;
if(/*cin流不为空*/temp=cin.getchar())
{
system("cls");//清空屏幕
cout << Text;
break:
}
cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。需要注意保证从流中读取数据能正常运行。
例如:
int a,b;
cin>>a>>b;
若从键盘中输入:21 abc 回车
变量a从输入流中提取整数21,提取操作成功,此时cin流出于正常状态。cin跳过读取空格,读取下一段缓冲区,但在变量b准备提取一个整数时,遇到了字母a,显然提取操作失败了,此时,cin流被置为出错状态。
只有在正常状态,才能从输入流中提取数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char temp;
if(/*cin流不为空*/temp=cin.getchar())
{
system("cls");//清空屏幕
cout << Text;
break:
}
if(/*cin流不为空*/temp=cin.getchar())
{
system("cls");//清空屏幕
cout << Text;
break:
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if(cin.rdbuf()->in_avail()!=0)//判断输入流不为空;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看看readsome这个函数的帮助吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询