c++ getline 读不到东西_C++ getline()函数问题
你的位置:
问答吧
-> 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()函数问题相关推荐
- c++ getline 读不到东西_C++,使用getline一直读取不到文件中的内容
想试着写一个做矩阵运算的代码,然后发现一直都无法使用getline()从文件中读取矩阵.但是我在别的代码中却可以使用getline(),下面是代码. #include #include #includ ...
- 读 zepto 源码之工具函数
对角另一面 读 zepto 源码之工具函数 Zepto 提供了丰富的工具函数,下面来一一解读. 源码版本 本文阅读的源码为 zepto1.2.0 $.extend $.extend 方法可以用来扩展目 ...
- 一文读懂什么是Python魔法函数
一文读懂什么是Python魔法函数 Python的魔法函数是指Python的类中,一系列函数名由双下划线包裹的函数. 笔者最初接触到魔法函数的使用是在Pytorch中,在Pytorch中的Datase ...
- c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)
c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...
- ifstream 中 getline读文件三种方式
#include<iostream> #include "fstream" #include <string> //#include<iomanip& ...
- 《四书五经》之大学全文、注释及读解 好东西啊
http://www.douban.com/group/topic/2058726/[原文] 大学之道(1),在明明德(2),在亲民(3),在止于至善. 知止(4)而后有定:定而后能静:静而后能 ...
- mfc如何判断读到文件尾_C++ 判断读取文件尾
主要在于eof()不只是读取文件的最后一个字符,它会接着往后读取,如果此函数返回ture时,则此时返回的文件结束符0xFF才是真正的结尾. 具体内容如下: 在使用C/C++读文件的时候,一定都使用过e ...
- c c++ 函数内数组初值_C/C++函数指针与指针函数
关于指针,前面文章C语言指针详解有过介绍,这里主要讨论函数指针和指针函数. 1 什么是指针? 定义:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量; 上面一个 4GB 的内存可以存放 ...
- 【C 语言】文件操作 ( 读文本文件 | 文本加密解密 | fgets 函数 | fputs 函数 )
文章目录 一.从文件中读取多行文本 二.文本文件加密 三.文本文件解密 一.从文件中读取多行文本 首先 , 以读的方式打开文件 ; // 打开一个文件 , 以读的方式 // r : 使用读的方式打开一 ...
最新文章
- Office 365 系列之一:初识Office 365
- Theano深度学习入门
- html棍子英雄电脑版源码,英雄难过棍子关电脑版
- 【小米面试题】-给定一个具体时间,计算时针与分针之间的角度
- 基于YOLOv4的matlab深度学习的道路标志识别
- 推荐5款心仪的电脑软件
- pc端微信二维码支付流程及问题排查
- android人脸识别的背景图_Android原生人脸识别Camera2+FaceDetector 快速实现人脸跟踪...
- 体脂的计算Java_简单测试体脂率的两种经验公式
- 魔兽世界开服一条龙服务端架设服务器搭建
- iOS-AFNetworking源码解析(五)
- 用Android做的一个简单的视频播放器
- WIN10 kernel security check failure蓝屏解决策略
- 因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项目的版本
- 计算机网络 之 DNS (Domain Name System)域名服务器
- 完美国际真数苹果_苹果手机:Checkm8漏洞永久性破解A5-A11设备 全线旧设备实现完美越狱...
- 配置Chrony同步时间,以及ntpd,ntpupate
- React(一)——快速入门
- ESP8266-Arduino编程实例-MPU6500加速计陀螺仪驱动
- 一个grpcServer实现多个proto文件