![]() |
#2
LUNNAN2010-05-27 22:59
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 由此结束循环。 本文来自CSDN博客,转载请标明出处:http://blog. 可以参见这篇文章, while((file2.eof())==0) { file2.read((char *)&stu2[i],sizeof stu2[i]); cout<<"学号:"<<stu2[i].no<<"姓名:"<<stu2[i].name<<"分数:"<<stu2[i].score<<endl; i++; } 改为 while(file2.read((char *)&stu2[i],sizeof stu2[i])) { cout<<// ++i; } |

#include "stdafx.h"
#include "fstream"
#include "iostream"
using namespace std;
struct student
{
int no;
char name[10];
float score;
};
int main(int argc, char* argv[])
{
int i;
struct student stu[3];
struct student stu2[3];
for( i=0;i<3;i++)
{
cout<<"请输入第"<<i+1<<"个学生信息:(学号,姓名,分数)"<<endl;
cin>>stu[i].no>>stu[i].name>>stu[i].score;
}
ofstream file1;
ifstream file2;
file1.open("student.txt",ios::out|ios::app);
for( i=0;i<3;i++)
file1.write((char *)&stu[i],sizeof stu[i]);
file1.close();
file2.open("student.txt",ios::in);
i=0;
while((file2.eof())==0)
{
file2.read((char *)&stu2[i],sizeof stu2[i]);
cout<<"学号:"<<stu2[i].no<<"姓名:"<<stu2[i].name<<"分数:"<<stu2[i].score<<endl;
i++;
}
file2.close();
return 0;
}
程序目的往文件写入学生信息,然后在从文件读出学生信息。如果没有读到文件尾就读出信息否则关闭文件。但是为什么多读了一些内容? #include "fstream"
#include "iostream"
using namespace std;
struct student
{
int no;
char name[10];
float score;
};
int main(int argc, char* argv[])
{
int i;
struct student stu[3];
struct student stu2[3];
for( i=0;i<3;i++)
{
cout<<"请输入第"<<i+1<<"个学生信息:(学号,姓名,分数)"<<endl;
cin>>stu[i].no>>stu[i].name>>stu[i].score;
}
ofstream file1;
ifstream file2;
file1.open("student.txt",ios::out|ios::app);
for( i=0;i<3;i++)
file1.write((char *)&stu[i],sizeof stu[i]);
file1.close();
file2.open("student.txt",ios::in);
i=0;
while((file2.eof())==0)
{
file2.read((char *)&stu2[i],sizeof stu2[i]);
cout<<"学号:"<<stu2[i].no<<"姓名:"<<stu2[i].name<<"分数:"<<stu2[i].score<<endl;
i++;
}
file2.close();
return 0;
}