| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4784 人关注过本帖
标题:一个getline和cin.geline这两个函数的区别
只看楼主 加入收藏
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用wfpb在2007-3-12 21:58:36的发言:

lz没提出来,我还真没注意这个问题,后来查了下MSDN,想想会不会是如下原因,望大家一起讨论。。。

istream::getline:
Extracts characters from the stream until either the delimiter delim is found, the limit nCount–1 is reached, or end of file is reached. The characters are stored in the specified array followed by a null terminator. If the delimiter is found, it is extracted but not stored.

The second template function replaces the sequence controlled by str with a sequence of elements extracted from the stream is. In order of testing, extraction stops:
1、At end of file.
2、After the function extracts an element that compares equal to delim, in which case the element is neither put back nor appended to the controlled sequence.
3、After the function extracts is.max_size() elements, in which case the function calls setstate(ios_base::failbit).

也就是说,cin.getline执行时,当用户输入一个回车后,cin.getline从istream中吸取出\n(但是不store),然后函数结束.getline则是把第一个\n当作一行语句中的一个字符对待,因此第二个回车才是函数结束的标志(我总觉得和put back这句有关,但是我的解释还有一点问题,就是put back到底做了什么,getline中有这句,cin.getline没有这句,他们是在这有区别吗?)

这个正确


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-13 22:38
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

呵呵,song4,你来了,看来这次你支持错了。

的确如litcatyx所说,这是VC6的BUG, 我用标准编译器MinGW和Dev试过了,都是只有一个回车就输出了。

也就是说,这是因为VC6对标准C++的不完全支持所导致。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-13 23:28
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
不对啊
我文件操作总用这个啊
我在C++。。。。(程序设计???)那个经典的书里面见过啊
一个读回车,一个不读

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-14 11:23
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

没细读他的文章
原来真是BUG,那只能怪书旧了。。。

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-14 11:24
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
getline(is, size, delim)//从is中读字符并存储到sink.
//直到文件结速或读到delim(在本例中为\n)
//读取delim然后丢弃delim.(从流中提取了delim,不放到sink中).
很可能是BUG,就像单步执行那样,输入\n,读入并丢弃按理说应该就退出了.
但是也许丢弃\n后并没有退出,而是暂停了,
再输入\n才激活函数然后才退出
注意:红字部分纯属虚构

getline原型:
template<class CharType, class Traits, class Allocator>
basic_istream<CharType, Traits>& getline(
basic_istream<CharType, Traits>& _lstr,
basic_istream<CharType, Traits, Allocator>& _Str,
CharType _Delim
);

[此贴子已经被作者于2007-3-14 21:09:45编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-14 20:22
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
以下是引用dlcdavid在2007-3-14 20:22:32的发言:

很可能是BUG,就像单步执行那样,输入\n,读入并丢弃按理说应该就退出了.
但是也许丢弃\n后并没有退出,而是暂停了,
再输入\n才激活函数然后才退出
注意:红字部分纯属虚构



LS这个是什么意思呀?你的意思是说应该这样的
getline(is, size, delim)//从is中读字符并存储到sink.
//直到文件结速或读到delim(在本例中为\n)
//读取delim然后丢弃delim.(从流中提取了delim,不放到sink中).


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-14 21:58
bill8888
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2007-3-10
收藏
得分:0 

这还是个问题,我刚才试过了,确实跟编译器有关,我在dev c++里就只需要输入一个回车
但是又在vc++里试了一下,这里就需要敲击两下回车才显示


2007-03-15 00:41
zhen16
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-1-4
收藏
得分:0 
真的很感谢名位可能真的是VC6的BUG吧,要其它编绎器中没有这问题
2007-03-15 13:01
快速回复:一个getline和cin.geline这两个函数的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011869 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved