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
更多推荐


所有评论(0)