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 设备上读入或写出的字符序列。术语“流”试图说明字符是随着时间
顺序生成或消耗的。
这个问题到这里大家应该都明白了。如果还不明白或有什么疑问,大家一起讨论。有问题时记的叫我啊。
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 设备上读入或写出的字符序列。术语“流”试图说明字符是随着时间
顺序生成或消耗的。
这个问题到这里大家应该都明白了。如果还不明白或有什么疑问,大家一起讨论。有问题时记的叫我啊。
- getline的一个问题
- getline()的问题
- c++ Getline()的问题
- getline函数的一些问题
- getline问题
- 【Q&A】getline读取文本文件的问题
- getline读取不等待输入的问题
- 关于getline 什么时候截止的问题
- 关于getline输入的一个小问题
- cin后使用getline的小问题
- getline中的ctrl+z的问题
- 关于C++中getline引发的问题
- 关于C++里面getline的四个困惑的问题
- 运用ifstream的getline时需要注意的问题
- 原创:运用ifstream的getline时需要注意的问题
- 运用ifstream的getline时需要注意的问题
- 关于C++的getline换行符的问题
- c++的getline一个关于缓冲区的一个小问题
- AJAX级联菜单
- XML序列化与反序列化
- 成熟的架构+创新的扩展
- 测试人员容易遗漏一些隐藏的缺陷
- 软件需求的困境 分析代替了需求
- getline()的问题
- 深刻揭示Python 与C/C++互动
- BizTalk 2006 简单入门示例程序 Version 2.0(附源项目文件下载)
- IE中Image对象onload失效问题
- .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常
- Web改变世界,我们以REST的方式创造Web
- sql语句:横表到纵表的方法
- linux查看文件内容
- 安全界最具影响力的15大人物排行榜