问个老问题了,有关cin

darcymei 2003-11-09 04:41:19
以前好想看过这样的帖子,找不到了。
int i;
while(cin>>i);
为什么要两次ctrl+z才能结束。
而且后一个ctrl+z还在cin中,如何清空输入流(这个方法很多,希望看到各种不同的,并请说说效率方面如何)。
...全文
6 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
darcymei 2003-11-10
有一次是VC环境要求,能问一下为什么吗?
回复
fierygnu 2003-11-10
推荐《The C++ Standard Library A Tutorial and Reference》
回复
baizhj 2003-11-10
to mmlymlymly(mly),先编译连接,然后再运行,如果是在VC环境下,自然得按两次,因为有一次是VC环境要求的.
回复
kurt8276 2003-11-09
你们我都不动
回复
darcymei 2003-11-09
谢谢老大,还有个问题想问一下,对于标准库的学习您是怎么样的呢。是找本有关的书来看,还是直接看编译器的帮助手册(如msdn),我始终觉得前者太不完整,后者太不详细,直接看头文件一堆宏又看得人晕头转向。请问您有什么好方法吗?
回复
短歌如风 2003-11-09
mmlymlymly你说的那个贴子我看过了, fierygnu的方法是我们用的。而更好的写法是:

cin.clear();//先清除错误位
cin.ignore(std::numeric_limits<std:streamsize>::max(), '\n');//无论行有多长……

与你的方法相比,这段代码可以在从文件输入时也有效。
你要注意,cin输入是以行为单位的,在执行这段时,缓冲区中的内容不会超过一行,并且一定会有一个换行符,所有这段代码是有效的。

在输入是stdin时,你的代码看来也有效,但我不知道是C标准规定的还是Windows系统的作用,如果是后者,我建议你把这种方法忘掉。即使使用这种方法,也不要忘了加一段注释,因为用seekg来实现这一功能远没有用ignore更容易懂。
回复
darcymei 2003-11-09
to baizhj(baizhj) 说话负责点好伐,vc下须按2次,你有没有试过啊!
我没有bcc,那看来是vc的bug 了喽。
还有麻烦短歌老大帮忙看下
http://expert.csdn.net/Expert/topic/2427/2427751.xml?temp=2.953738E-02
那几种方法哪个比较好呢?
还有就是能不能谈谈您对cin或者流结构的一些看法,我看msdn总是看得很糊涂,这方面有介绍的书又不是很多,小弟先谢过了。
回复
ssbull 2003-11-09
我也遇到这样的问题,总是想不通,可楼上两位老兄好像也没说明白原因:)
学习ing
回复
短歌如风 2003-11-09
要注意的就是,在输入^Z之后,流处于EOF状态,要用clear方法恢复状态才能继续输入。
回复
baizhj 2003-11-09
在Visual C++中,只按了一次就行了!不管是一次还是两次,是因为你的输入数据和i的数据类型不一样造成的,系统认为你的输入是非法输入,表示输入结束.
回复
短歌如风 2003-11-09
#include <iostream>
#include <limits>
using std::cin;
using std::cout;
using std::endl;

int main(int argc, char* argv[])
{
int i;
char ch;
while(cin >> i)
cout << i << endl;
cout << "Input char:";
cin.clear();
cin>>ch;
cout << "char:" << ch << endl;
return 0;
}
没有问题。只用输入一次^Z。
用的是STLport 4.5.3,编译器BCC32 5.6。

回复
rushinger 2003-11-09
坐在第二排,有人回答了好听得清楚些。
回复
zhaochong12 2003-11-09
搬个小凳子,坐在第一排...
回复
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2003-11-09 04:41
社区公告
暂无公告