你的位置:

问答吧

-> 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

更多推荐