getline()的问题

来源:互联网 发布:ppt画网络拓扑图 编辑:程序博客网 时间:2024/05/29 05:12
我在写一个输入操作符时遇到一个问题。大家看这段源码:
istream &operator>>(istream &os,checkoutrecord &che)
{     cout<<"enter the booker: ";
      getline(os,che.booker);
      cout<<"enter book_id: ";
      os>>che.book_id;
      cout<<<"enter tile: ";
      cin.sync();
      getline(os,che.tile);
      if(os)
         che.borrower=make_pair(che.booker,che.tile);
      else
         che=checkoutrecord();             
      return os;
}
这里面有两个getline()当我没有清空输入缓冲区时节che.tile总是不能输入,后来知道
当我们用键盘输入时,是先输入到存储区里,当输入che.book_id时,我们按回车结束,
那系统只把回车前的数据给了che.book_id
而回车还在输入缓冲区,然后直接给了后面的输入,那第二个getline就直接输出了。
所以就该调用一下sync()清一下输入流。
    认识到这个后我用cin.clear()试了一下,不行!!为什么呢?原来是这么回事。
cin.clear()只是将cin的状态位设置为有效。比如while(cin>>x)这个退出循环时,
我们是按ctrl+z文件结束符来结束输入,这时候cin的eofbit位被设置成1,
那cin就处于无法输入状态,clear把所有的状态位设置为有效,才可以继续输入,
但不清输入缓冲区。
   这里还有一个疑点就是为什么os不读入空白字符或回车呢。原因在这里,getline()这个函数接受两个参数:一个输入流对象
和一个 string 对象。getline 函数从输入流的下一行读取,并保存读取的内容到不包括换行符。和输入操作符不一样的是,
getline 并不忽略行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。
如果第一个字符就是换行符,则 string 参数将被置为空 string。
   那流的解释C++ Primer里给出了解释:处理格式化输入和输出的 iostream 库。iostream
库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流。
流是指要从某种 IO 设备上读入或写出的字符序列。术语“流”试图说明字符是随着时间
顺序生成或消耗的。
   这个问题到这里大家应该都明白了。如果还不明白或有什么疑问,大家一起讨论。有问题时记的叫我啊。