你的位置:

问答吧

-> C/C++

-> 问题详情

C++ getline()函数问题

在下面这段代码中,是先把一个文件中字符按行存贮在一个vector容器中,然后用sstream对象来实现逐单词输出字符。

我用的文件是在一个网站上复制的一个英文短笑话

Who Are Crooks?

A newspaper once carried an editorial which stated

bluntly that half the city council were crooks.

Under penalty of arrest, the editor issued

following retraction: HALF THE CITY COUNCIL AREN'T CROOKS.

From: http://www.hxen.com/englisharticle/xiaohua/2011-08-28/153213.html

发现一个问题,当while(getline(input,line))时,最后一行那个网址可以存储到vector中,

当用while(getline(input,line),!input.eof())时,最后一行那个网址则没有存储,是什么问题造成的?求解答

代码如下:

#include

#include

#include

#include

#include

using namespace std;

int main()

{

string filename,word,line;

cout<

cin>>filename;

ifstream input(filename.c_str());

if(!input)

cout<

vector svec;

while(getline(input,line))

svec.push_back(line);

input.close();

for(vector::iterator iter = svec.begin();

iter != svec.end(); ++iter)

{

istringstream isstr(*iter);

while(isstr >> word)

cout<

}

system("pause");

return 0;

}

作者: zq273632878

发布时间: 2011-08-31

应该是先读到了,此时input已经到了末尾,所以 !input.eof()条件不满足

作者: bdmh

发布时间: 2011-08-31

while(getline(input,line),!input.eof())

while里为啥用 ,毫无意义

看看下面代码输出啥

int i = (1,2);

cout<

作者: luciferisnotsatan

发布时间: 2011-08-31

最后一行 eof了,而while的取值是!input.eof(),前面那个对while来说没意义

作者: luciferisnotsatan

发布时间: 2011-08-31

读完最后一行的最后一个字节的时候,由于没有遇到换行符,所以还会继续尝试往后读,于是发生 EOF。

但是这个 getline 调用确实正常地读到了数据,所以输入流只设置 eofbit,不设置 failbit。

作者: hpsmouse

发布时间: 2011-08-31

引用 2 楼 luciferisnotsatan 的回复:

while(getline(input,line),!input.eof())

while里为啥用 ,毫无意义

while 里用逗号操作符通常是希望先让前面那个表达式产生副作用,然后再判断后面的条件。

作者: hpsmouse

发布时间: 2011-08-31

引用 4 楼 hpsmouse 的回复:

读完最后一行的最后一个字节的时候,由于没有遇到换行符,所以还会继续尝试往后读,于是发生 EOF。

但是这个 getline 调用确实正常地读到了数据,所以输入流只设置 eofbit,不设置 failbit。

不太明白,能不能详细的解释下。两个while语句的判断条件分别是什么?

为什么while(getline(input,line),!input.eof())时,在那个网址之前会设置eofbit?还是不太明白.

while(getline(input,line))的判断条件又是什么?

作者: zq273632878

发布时间: 2011-08-31

不要使用

while (条件)

更不要使用

while (组合条件)

要使用

while (1) {

if (条件1) break;

//...

if (条件2) continue;

//...

if (条件3) return;

//...

}

因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。

典型如:

下面两段的语义都是当文件未结束时读字符

whlie (!feof(f)) {

a=fgetc(f);

//...

b=fgetc(f);//可能此时已经feof了!

//...

}

而这样写就没有问题:

whlie (1) {

a=fgetc(f);

if (feof(f)) break;

//...

b=fgetc(f);

if (feof(f)) break;

//...

}

类似的例子还可以举很多。

作者: zhao4zhong1

发布时间: 2011-08-31

输入流产生 EOF 的条件是,在已经读入最后一个字符的情况下,尝试从流中继续读取。

getline 遇到换行符或者 EOF 都会停止。如果最后一行的结尾处没有换行符,那么只能是遇到 EOF 停止,这时就会发生 getline 读到了数据,也产生了 EOF 的情况。

作者: hpsmouse

发布时间: 2011-08-31

getline(is, str) 返回 is 的引用,istream 类型存在一个到 void* 类型的转换,这个 void* 可以进一步转换为 bool。其最终效果相当于调用了 istream::fail() 进行判断。

产生 failbit 的过程有点啰嗦,暂时可以理解为输入失败就会产生 failbit。

对于 getline 来说,由于不能确定最后一行的结尾有没有换行符,所以应该判断 failbit,不应该判断 eofbit。

作者: hpsmouse

发布时间: 2011-08-31

出现这种情况是因为楼主的while条件写的不对,楼主可以写成

C/C++ code

while(!input.eof(),getline(input,line))

如果按楼主的那种写法,实际上最后一行已经读进了line变量,这时文件已经结束了,在楼书测试!input.eof时返回false,这时循环条件不成立,循环结束,那么也就无法在循环体内把最后一行存储在vecto中了。

作者: lvjing_CSDN

发布时间: 2011-08-31

引用 10 楼 lvjing_csdn 的回复:

出现这种情况是因为楼主的while条件写的不对,楼主可以写成

C/C++ code

while(!input.eof(),getline(input,line))

如果按楼主的那种写法,实际上最后一行已经读进了line变量,这时文件已经结束了,在楼书测试!input.eof时返回false,这时循环条件不成立,循环结束,那么也就无法在循环体内把最后一行存储在vecto中了。

逗号表达式的值是最后一个表达式的值,所以这个和 while(getline(input,line)) 其实是一回事。

按照你描述的意思应该写成 while(!input.eof() && getline(input, line)),这是对的,但是没有必要。因为如果 input.eof() 为 true,getline(input, line) 一定会设置 failbit。

作者: hpsmouse

发布时间: 2011-08-31

你用了逗号表达式,逗号表达式是最后一个表达式的值。所以while(getline(input,line),!input.eof())

他会取!input.eof()的返回值作为最终结果。

作者: LCL_data

发布时间: 2011-08-31

额,居然用条件组合的while,这样会给自己很多麻烦吧,不过用好了也蛮简洁,对于你的while(getline(input,line),!input.eof())

语句, 应该清楚逻辑结构才行。 我没有环境来跑你的程序,不过问题应该处于逻辑判断上。

while中有两个逻辑判断

getline(input,line) 和

!input.eof()

这两个判断一定不会一起应用目标数据(input),所以呢,执行完getline(input,line),input已经被改动了,接着执行!input.eof()时就返回了false。

这个主要在于对while()的条件组合的理解吧。

你改成while(!input.eof(),getline(input,line))试试。如果成功了记得回复我一下哦。

作者: fmworld

发布时间: 2011-08-31

c++ getline 读不到东西_C++ getline()函数问题相关推荐

  1. c++ getline 读不到东西_C++,使用getline一直读取不到文件中的内容

    想试着写一个做矩阵运算的代码,然后发现一直都无法使用getline()从文件中读取矩阵.但是我在别的代码中却可以使用getline(),下面是代码. #include #include #includ ...

  2. 读 zepto 源码之工具函数

    对角另一面 读 zepto 源码之工具函数 Zepto 提供了丰富的工具函数,下面来一一解读. 源码版本 本文阅读的源码为 zepto1.2.0 $.extend $.extend 方法可以用来扩展目 ...

  3. 一文读懂什么是Python魔法函数

    一文读懂什么是Python魔法函数 Python的魔法函数是指Python的类中,一系列函数名由双下划线包裹的函数. 笔者最初接触到魔法函数的使用是在Pytorch中,在Pytorch中的Datase ...

  4. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  5. ifstream 中 getline读文件三种方式

    #include<iostream> #include "fstream" #include <string> //#include<iomanip& ...

  6. 《四书五经》之大学全文、注释及读解 好东西啊

    http://www.douban.com/group/topic/2058726/[原文]    大学之道(1),在明明德(2),在亲民(3),在止于至善. 知止(4)而后有定:定而后能静:静而后能 ...

  7. mfc如何判断读到文件尾_C++ 判断读取文件尾

    主要在于eof()不只是读取文件的最后一个字符,它会接着往后读取,如果此函数返回ture时,则此时返回的文件结束符0xFF才是真正的结尾. 具体内容如下: 在使用C/C++读文件的时候,一定都使用过e ...

  8. c c++ 函数内数组初值_C/C++函数指针与指针函数

    关于指针,前面文章C语言指针详解有过介绍,这里主要讨论函数指针和指针函数. 1 什么是指针? 定义:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量; 上面一个 4GB 的内存可以存放 ...

  9. 【C 语言】文件操作 ( 读文本文件 | 文本加密解密 | fgets 函数 | fputs 函数 )

    文章目录 一.从文件中读取多行文本 二.文本文件加密 三.文本文件解密 一.从文件中读取多行文本 首先 , 以读的方式打开文件 ; // 打开一个文件 , 以读的方式 // r : 使用读的方式打开一 ...

最新文章

  1. Office 365 系列之一:初识Office 365
  2. Theano深度学习入门
  3. html棍子英雄电脑版源码,英雄难过棍子关电脑版
  4. 【小米面试题】-给定一个具体时间,计算时针与分针之间的角度
  5. 基于YOLOv4的matlab深度学习的道路标志识别
  6. 推荐5款心仪的电脑软件
  7. pc端微信二维码支付流程及问题排查
  8. android人脸识别的背景图_Android原生人脸识别Camera2+FaceDetector 快速实现人脸跟踪...
  9. 体脂的计算Java_简单测试体脂率的两种经验公式
  10. 魔兽世界开服一条龙服务端架设服务器搭建
  11. iOS-AFNetworking源码解析(五)
  12. 用Android做的一个简单的视频播放器
  13. WIN10 kernel security check failure蓝屏解决策略
  14. 因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项目的版本
  15. 计算机网络 之 DNS (Domain Name System)域名服务器
  16. 完美国际真数苹果_苹果手机:Checkm8漏洞永久性破解A5-A11设备 全线旧设备实现完美越狱...
  17. 配置Chrony同步时间,以及ntpd,ntpupate
  18. React(一)——快速入门
  19. ESP8266-Arduino编程实例-MPU6500加速计陀螺仪驱动
  20. 一个grpcServer实现多个proto文件

热门文章

  1. Android Studio错误代码汇总
  2. 程序的内存模型—内存四区—堆区
  3. 【一起玩光剑】光剑第二期:新建GitHub上传OTA初始程序
  4. 基于FPGA的bubble游戏开发
  5. java中实现对list的模糊查询
  6. 【技术系列】浅谈GPU虚拟化技术(第一章)
  7. POST的表单数据参数过多问题
  8. 安装CentOs 5.5后无法显中文(中文乱码)
  9. 分享几个在线生成网址二维码的API接口
  10. Sql 查询当天、本周、本月记录