注册 登录
编程论坛 C++教室

关于 while(getline(cin,line))的问题,

sadan20111 发布于 2009-08-01 14:01, 4722 次点击
#include   <iostream>
#include  <string>  
  
  using namespace std;  
  
  main()   
  { int i=3;
   string   line;   
  while(getline(cin,line))
  {  
  cout<<line<<endl;
  
  }
 cout<<i<<endl;
  
  
  return 0;
  }
 
 
这个程序好像是个死循环,怎么能跳出循环,执行cout<<i<<endl;这句话呢,while是以istream类对象为判断条件的,那不就是遇到结束或是无效输入就跳出循环体吗?那string中,getline不是不能忽略换行符?那回车了,为什么还挑不出来呢?怎么能跳出来啊,就是什么样子才是条件才为假的啊??谢谢
11 回复
#2
pangding2009-08-01 18:28
回复 楼主 sadan20111
用EOF就可以终止循环。
如果你用的windows,可以试试输入几行文字之后,按一下Ctrl + Z。
#3
sadan201112009-08-01 20:59
回复 2楼 pangding
谢谢2楼,但是也是不行的,我输入结束符也是不可以的,还是挑不出来,还是被当成有效字符了,什么原因呢??2楼能试试程序吗?我是VISTA的系统,是不是结束符不一样呢??
#4
pangding2009-08-01 23:59
回复 3楼 sadan20111
我想应该行呀,你多输入几次ctrl-z试试呢?你用的是什么编译器?
(抱歉,我现在试不了你的程序。现在我在别人家,他的电脑里没有编译器……)
#5
CrystalFan2009-08-02 00:17
在Visual C++ 6.0中,按两次【Ctrl+Z】可以退出,但是,输出比输入滞后一行。
#6
pangding2009-08-02 10:27
回复 5楼 CrystalFan
嗯,我想也是这上问题。VC6.0有个BUG,就是它的行输入行再输完回车之后还要再输入一个字符才行,去网上搜一下,有解决这个BUG的方法~
#7
sadan201112009-08-02 12:33
回复 6楼 pangding
谢谢各位,我用的也是VC6.0,可是我输入一行文字以后,输入几次结束符都没有用,要按回车输出文字以后,然后输入结束符,要按超过好几次,就是说要回车几次,每次回车都输入结束符,才能跳出循环。。。。请问5楼,两次你就跳出循环了吗啊?你是在输入文字以后输入结束符吗??
#8
leeco2009-08-02 14:55
回复 7楼 sadan20111
你是怎么输入结束符的?
#9
sadan201112009-08-02 15:09
回复 8楼 leeco
输入几次ctrl+z啊,VISTA难道和XP的不一样吗?
#10
leeco2009-08-02 15:42
回复 9楼 sadan20111
要在行首输入ctrl+z然后回车。

不过你也可以用下面这个程序

#include <stdio.h>
main()
{
    putchar(-1);
    putchar('0');
}

然后把程序输出的0前面那个空格一样的字符复制下来,这个字符就是EOF,你可以在需要输入EOF的地方粘贴进去,绝对奏效
#11
sadan201112009-08-03 09:17
回复 10楼 leeco
谢谢,恩,要首行输入,是不是和输入缓冲区有关系吧。当getline()输入遇到换行符停止输入的时候,那'\n'会留在缓冲区吗?还是被自动清空了呢??
#12
pangding2009-08-03 12:53
回复 11楼 sadan20111
读取换行符,然后在储存位置上把它换成\0。
当然你也可以提供第三个参数,用于指定一个其它的分隔符。

至于那个行首输入ctrl-z的原因是,如果在行间出现的话,会被当作一个普通字符读入。
其实这很容易发现,你自己做几个实验试试就知道了。如果对实验结果想不明白再上来问会好一点~
1