【转】C++中读取一行数据:get和getline
2017-05-22 21:04
176 查看
u011504118
<div class="article_r"> </div> </div> <div class="blog_article_c clearfix"> <h3 class="article_t">C++中读取一行数据:get和getline</h3> <p class="date"><i>发表于</i><em>2015/3/24 19:50:18 </em><i>1554</i><span>人阅读</span></p> <p class="category_p"> 分类: <span>C/C++</span> </p>
转载请注明出处谢谢:http://blog.csdn.net/u011504118
在C++中最常用到的输入自然是
cin了,但它有个缺点就是当输入有空格时,只能读取到空格前面的内容。我们自然是希望能够读取到一整行的内容了。好在C++中提供了两个函数:
get和
getline, 也就是这篇文章的主角了。先从
getline开始吧。
getline()
当我们想从输入流中读取到一行数据时,我们可以这样调用cin.getline(buf, size), 读取指定长度的字符串或遇到换行符时结束并将结果保存在buf中。
getline()通过换行符来确定结尾,但不保存换行符。还有其他的几个重载函数,这里就不多说了。
get()
cin.get(buf, size)也是读取一行数据,但它不读取末尾的换行符,换行符会被保留在输入队列中,也就是说,当第一次调用后,换行符留在输入队列中,因此第二次调用的时候看到的第一个字符便是换行符。可使用
cin.get()读取下一个字符(即使是换行符)。也可以这样使用
cin.get(buf,size).get()
get()测试代码:
#include<iostream> using namespace std; int main() { const int size = 20; char *str = new char[size]; cout << "get():" << endl; cout << "请输入字符串: "; cin.get(str, size); cout << "the string is: " << str << endl; delete[]str; str = new char[size]; cout << "请再次输入字符串: "; //cin.get(); cin.get(str, size); cout << "the string now is: " << str << endl; delete[]str; return 0; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[/code]
注释掉
cin.get()的时候可以看到:
当第一次输入回车后还没等到第二次输入结果就已经出来了!加上
cin.get()就可以正常输入第二个字符串了。
好的,那么问题来了。既然
getline()比
get()方便那么多,为什么还要有
get()呢?
get() V.S getline()
毫无疑问,getline()比起
get()用起来要方便得多。但你是否想过这样一个问题:当用户输入的字符串的长度超过了我们定义的size,这时候我们该如何检测呢?如果说不管它的话,因为剩下的字符串还在输入流中,如果还有第二次的用户输入的话,程序就直接从输入流中提取字符串了。很明显,这是一个严重的Bug。所以我们就得找个办法来检测这种情况。聪明的你可能已经想到了
get()的优势了。没错,就是利用这次看似多余的
cin.get()来判断取得的字符是不是换行符,如果是的话证明我们读取到了整个字符串了。而
getline()要检测就比较麻烦了。这个比较简单,这里就不再给出例子了。大家可以动手写一写,理解就会更深了。
getline()和
get()还有一个大的区别:当
get()读取到空行时会设置失效位(failbit),这意味着接下来的输入都被阻断,但可以用
cin.clear()来恢复。
getline读取到空行时则不会有这个问题。
看一下例子吧:
#include<iostream> using namespace std; int main() { const int size = 20; char *str = new char[size]; cout << "get():" << endl; cout << "请输入字符串: "; cin.get(str, size); // 通过获得的字符串长度来判断是否为空行 /* if (strlen(str) == 0) { cin.clear(); } */ cout << "the string is: " << str << endl; delete[]str; str = new char[size]; cout << "请再次输入字符串: "; cin.get(); cin.get(str, size); cout << "the string now is: " << str << endl; delete[]str; return 0; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[/code]
运行程序,然后输入回车,可以看到这样的结果:
当回车后,程序并没有执行第二次的输入,而是直接输出了结果。
把上面的代码中的注释去掉后就能看到正确的结果了,比如:
getline()和
get()应该是还有其它的区别的,等以后遇到了再补上吧。
最后还有一点要提醒的就是,对指针使用
new之后一定要用
delete掉,否则可能会造成内存泄露!!!
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
</div> <div class="blog_handle"> <span id="digg" style="cursor:pointer"><i class="iconfont"></i><em>0</em></span> <span id="bury" style="cursor:pointer"><i class="iconfont"></i><em>0</em></span> </div> <div class="prev_next"> <a href="/article/details?id=44416299" class="prev" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);">上一篇</a> <a href="/article/details?id=44794819" class="next" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">下一篇</a> </div> </div>
相关文章推荐
- C++中读取一行数据:get和getline
- 从终端读取一行数据,fgets,gets,c++ string类定义的getline
- 从终端读取一行数据,fgets,gets,c++ string类定义的getline
- C++中关于get()和getline()函数读取行的问题
- (四十七)读取一行输入getline()和get()
- 关于c++用getline读取一行的坑
- C++使用getline获取一行数据
- c++ getline用法实例,读取一行到字符数组+读取一行到字符串
- C++中怎样读取文件一行数据
- 读取一行数据(C/C++语言)
- c++输入文件处理按行读取并且将实现对一行数据分别处理
- [原] C#泛型实现流中C/C++格式的struct数据的通用读取方法
- Python linecache.getline()读取文件中特定一行的脚本
- Get-Dbf through Powershell 使用Powershell读取DBF数据
- C++读取mat数据(1)【转载】
- 关于C++二进制文件读取转换,数据版本升级,增加字段等结构调整工具的思路。
- 收集两个C++写的从文本文件中读取数据保存到数组的程序
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- Get data from specified URI using WebRequest and WebResponse(读取网页数据并存入对应html文档)
- c++使用getline和ifstream读取文件