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全部输出来
展开
 我来答
匿名用户
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

改变设计是最简单的方法.
追问
嗯. . .谢谢你打这么多哈。我还没进入windows编程,不过谢谢你!
w别y云j间
高粉答主

推荐于2017-09-23 · 繁杂信息太多,你要学会辨别
知道大有可为答主
回答量:8903
采纳率:91%
帮助的人:803万
展开全部
  判断代码如下:
  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流被置为出错状态。
  只有在正常状态,才能从输入流中提取数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chujiangke001
推荐于2017-09-19 · TA获得超过1605个赞
知道小有建树答主
回答量:1352
采纳率:0%
帮助的人:697万
展开全部
char temp;

if(/*cin流不为空*/temp=cin.getchar())
{
system("cls");//清空屏幕
cout << Text;
break:
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Smile_diy
2013-03-22 · 超过14用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:29.7万
展开全部
if(cin.rdbuf()->in_avail()!=0)//判断输入流不为空;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
御含灵9r
2013-03-22 · TA获得超过4157个赞
知道大有可为答主
回答量:3007
采纳率:0%
帮助的人:2687万
展开全部
看看readsome这个函数的帮助吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式