我们会经常用到getline()函数,去从流中读取指定的一行内容。尤其是在牛客或者leetcode上刷题的同学,应该更为熟悉这个用法。但是通过这篇文章,你可能会发现你根本没有那么了解getline()这个函数。

问题起因:
今天在写项目的时候用到了C++ifstream流,利用它来读取指定文件的内容。我的读取文本如下:

我的预期是这样的:利用getline()一行一行的读文件,以空行作为界限,每一个小段做一个处理。

vector<string>v;
for(int i=0;i<2;++i){ v.clear();while( getline(in,str) ){         //读到空行的时候就跳出循环                              //一行一行读v.push_back(str);}//end of while//把下一行的空行读走;铺垫下一个host列表   咦,好像这里不用再操作了,空行已经被读走...Print(v);

简单的实现,感觉代码没有任何问题。不过就是这简单的操作却让人伤神了半天。 注意我的for循环是循环两次,按照预期,当读入空行时,getline()返回0,判断为假跳出循环,那么应该是会读入文本的前两段然后Print()打印。但是结果却是:文本内容全部打印! 我真的是懵逼,在风中凌乱。。。这么简单的几行代码也会出错,我哭/(ㄒoㄒ)/~~

上网百度getline()的用法,发现好像也没有错误呀:

函数声明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);返回值
成功:返回读取的字节数。
失败:返回-1。

读到空行返回值不是为0吗,但是为什么却没有按照预期跳出循环呢,我再哭/(ㄒoㄒ)/~~

最后,当我看到了 basic_istream::getline()这个概念,才猛然醒悟 —— 我们一般用的getline()是C++库里处理string流的getline(),而在项目中用到的文件ifstream读取的getline()是处理isream流的getline()。 这两个getline()原来是有区别的。 来看一下C++reference标准里边的后者返回值的定义:
额emm…,看不懂英文没关系,我来总结:在后者也就是处理istream流额时候,getline()的返回值是这样的:
只要可以读到文件内容(包括空行),返回值就一直是True. 如果读取失败,那么会抛出相对应的异常。

所以在我上述项目中的情境下,while()判断其实一直是true,因为一直都有读到内容,所以外层for循环其实是没有限制力的/(ㄒoㄒ)/~~ 所以如果要达到之前的预期,需要在循环体内手动的进行空行的判断:

for(int i=0;i<2;++i){  v.clear();while( getline(in,str) ){         //读到空行的时候就跳出循环                              if(str.size()==0)break;//一行一行读v.push_back(str);}//end of while

ok,这个故事告诉我们做学问还是不能一知半解,努力吧少年(ง •_•)ง

你真的了解getline()的返回值吗?—— basic_istream::getline() 与 string::getline相关推荐

  1. SpringMVC——控制器方法的返回值类型(ModelAndView、String、void、Object)

    文章目录: 1.控制器controller方法的返回值 1.1 返回值类型:ModelAndView 1.2 返回值类型:String(这里的String是视图) 1.2.1 控制器类 1.2.2 s ...

  2. C#多线程函数如何传参数和返回值

    提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托就是 具有 同样参数和返回值 的函数的集合. 比如 public delegate void MyDelegate(int a ...

  3. 使用反射获得jar包中的类、方法、参数、返回值类型,然后动态加载jar包运行方法

    其实我的需求是在系统中 测试用户导入的jar包,所有网上找了很多解决方案,踩过很多坑,再加上以前搞c++的,对java不是很熟, 这里特意记录下,算是基本满足需求了 使用反射获得jar包中的类.方法. ...

  4. 函数返回值是否使用引用类型的问题:理解引用、返回值

    在<对象更有用的玻璃罩--常引用>一文中,介绍了对象作为函数的参数时,推荐使用引用的形式.并且,如果实际参数的值不允许改变时,声明为常引用更佳. 在<第8周-任务1-方案3-复数类中 ...

  5. 获取SQL-SERVER数据库insert into操作的主键返回值

    插入一条记录后想要立刻获取其数据表中的主键返回值.这个主键是自动生成的,其实实现的方式有很多,比如再进行一次查询,获取出来.或者在插入数据之前取出最大值,在最大值上面加一等等,方法很多,但是有些很不方 ...

  6. 【前端06_JS_ECMA 语法标准】声明变量、数据类型*、tupeof返回值、输入输出、运算、循环、条件、函数*、事件*

    JavaScript_ECMA 概述 ECMA 语法标准 声明变量 全局变量 注释方法 数据类型 * typeOf 能返回的值 * 输入与输出 运算 算数运算 赋值运算 关系运算 关系运算中的特殊题目 ...

  7. 怎么优雅的在主线程获取子线程的返回值

    今天面试被面试官问道怎么自己实现主线程获取到子线程的返回值,且要优雅不能使用静态变量 方法一:使用FutureTask和Callable来实现 class Test{public static voi ...

  8. Mybatis一对多关联查询,返回值Map,字段自动映射

    功能描述 由于查询字段和表名都要支持动态配置,故查询返回值需要为List<Map<String,Object>>,不定义值对象. 查询结果列需要支持自动映射,不配置类属性和数据 ...

  9. C++ 多线程之带返回值的线程处理函数

    写在前面:         又是学C扎扎的一天,C扎扎学起来果然扎手.如果你能坚持看到文章最后,你会发现,好吧有可能你啥也发现不了,因为后面什么也没有~~~ 目录 1. 使用 async 函数创建线程 ...

最新文章

  1. 使用AndroidStudio编译NDK的方法及错误解决方案
  2. Java中的进程与线程
  3. OpenGL CPU光线跟踪
  4. 假设检验在数据分析中的应用
  5. Pub / Sub本地模拟器
  6. linux查看某进程cpu使用情况,linux中如何查看进程对应的cpu使用情况?
  7. git 无法提交空目录
  8. 微软vs2008快捷键
  9. VUE图片裁剪功能vue-img-cutter
  10. 新浪新规:9点关灯,公司加班要交空调费:1600元/小时
  11. 计算机技术与高中英语教学整合,计算机技术与高中英语课程整合的探讨(多媒体英语教学系列论文十篇).doc...
  12. 京东非自营下运费模式
  13. 张博涵清华大学_看了清华大学“神仙打架”,网友:我在这个世界上就是凑数的...
  14. laravel view
  15. MatLab中多项式
  16. 【SSL】1758连通图
  17. C语言continue用法
  18. 解构语音交互产品--VUI设计原则
  19. JAVA 并发编程-多个线程之间共享数据(六)
  20. 6-2 判断水仙花数 (10 分)

热门文章

  1. 文章选题立意新颖的一个简单妙招
  2. 弱监督学习框架 Detectron2/DRN-WSOD-pytorch 在服务器/windows上配置安装及使用
  3. 单点登录CAS学习(一):初识单点登录
  4. 打开软件提示丢失vcruntime140.dll下载安装详细教程
  5. verification和validation的区别
  6. 网络安全初学者工具安装:Kali,Windows xp虚拟机,pikachu靶场,burpsuite安装配置,phpstudy安装(学习笔记)
  7. 计算机网络——网络层知识点
  8. GROUP BY clause and contains nonaggregated 报错处理
  9. Go使用grpc+http打造高性能微服务
  10. VayoPro-SMT Expert|一分钟搞定拼板