首页 > 代码库 > ifstream?流?判断文件是否结尾的函数eof(.xml
ifstream?流?判断文件是否结尾的函数eof(.xml
<style
type="text/css">
pre{
line-height:1;
color:#800080;
font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;}
.selfFuc{color:#800080;}
.bool{color:#d2576f;}
.condition{color:#000080;font-weight:bold;}
.key{color:#000080;}
.var{color:#800000;font-style:italic;}
.Digit{color:#ff00ff;font-weight:bold;}
.includePre{color:#800080;}
.operator?{color:#008000;font-weight:bold;}
</style>
???fstream流的eof()??判断有点不合常理 ? ? ???按正常逻辑来说,如果到了文件末尾的话?,那eof()应返回真 ? ???但是,c++输入输出流如何知道是否到末尾呢? ? ???原来是根据的是:?如果fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。 ? ? ???假设 ? ???fin>>x;?//此时文件刚好读完最后一个数据(将其保存在x中) ? ???但是,?这时?fin.eof()仍未假?因为,fin流的标志eofbit是FALSE,?fin流此时认为文件还没有到末尾 ? ???只有当流再次读写时 ? ???fin>>x;?发现已无可读写数据,此时流才知道到达了结尾,这时才将标志eofbit修改为TRUE ? ???此时流才知道了文件到底了末尾 ? ? ? ???也就是说,eof在读取完最后一个数据后,仍是False, ? ??????????????????当再次试图读一个数据时,由于发现没数据可读了?才知道到末尾了,此时才修改标志,eof变为TRUE ? ? ? ? ? ??以下例子: ?
????ifstream?fin("D://line.txt");?? ?????? ????ofstream?fout("D://T_line.txt",ios::trunc);?? ?????? ?????? ????list<tag_Point>?test_list;?? ?????? ????tag_Point?test;??? ?????? ?????? ?????? ????while?(!fin.eof())?? ????{?? ??????? ?????? ?????? ?????fin>>test.x;?? ?????fin>>test.y;?? ?????fin>>test.z;?? ?????? ?????? ?????? ?????? ?????test_list.push_back(test);?? ??????? ?????? ????}?? ?????? ??????fin.close();?? ?????? ???????? ? ?在运行时?发现??test_list中的数据比文本中的数据多一行,也就是?文本中最后一行的数据写了两遍 ? ?始终无法理解 ? ??现在明白了:》 ? ??再读完最后一行后, ? ??因为fin.eof()仍为假,?所以会继续while循环 ? ??当执行到while的第一个语句???fin>>test.x时,发现无可读数据了,此时修改流属性,fin.eof?()变为TRUE ? ??再执行???fin>>test.y;?fin>>test.z;时,因为已经到文件末尾了?,所以?test保留了上次的值,也即test中的值为变,还是文本最后一行 ?
的数据
? ??此时再push_back(test),压入列表的仍是最后一行数据 ? ??由此导致了,列表中的数据比文本中的数据多一行 ? ? ? --------------------- ? ?
知道了原因?,便很好作出修改了
? ? ??修改为: ?
????while?(??fin>>test.x&&fin>>test.y&&?fin>>test.z)?? ????{?? ??????? ?????? ?????test_list.push_back(test);?? ??????? ?????? ????}?? ?????? ??????fin.close();?? ? ? ?这样便没问题了?,当读取完最后一行数据后,将其放入列表中,此时判断while条件,也就是再次读取数据,发现无数据可读,读取不成功?fin>>test.x返回False?由此结束循环。 ? ?
本文使用?书画小说软件?发布,内容与软件无关,书画小说软件?更惬意的读、更舒心的写、更轻松的发布。
ifstream?流?判断文件是否结尾的函数eof(.xml
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。