C++对文件读写关闭程序后再打开就不能读取数据,不关程序就可以

课程设计编了个学生管理系统,在保存读取数据时,如果是保存后关闭程序再打开程序就读出很奇怪的东西,但是如果不关程序直接,先保存数据,再删除数据,然后读取数据就没问题,各位大... 课程设计编了个学生管理系统,在保存读取数据时,如果是保存后关闭程序再打开程序就读出很奇怪的东西,但是如果不关程序直接,先保存数据,再删除数据,然后读取数据就没问题,各位大神帮看看~~

这里是读取的部分代码
int nCount1;
int nCount2;
int nCount3;

ifstream fin("data.txt",ios::binary);

while (!fin.eof()){
fin.read((char*)&nCount1,sizeof(nCount1)); //读取总数
fin.read((char*)&nCount2,sizeof(nCount2));
fin.read((char*)&nCount3,sizeof(nCount3));

CLesson* lesson =new CLesson[nCount1];
CStudent* student =new CStudent[nCount2];
CGrade* grade =new CGrade[nCount3];

for(int i1 = 0;i1 < nCount1;i1++){
fin.read( (char*)&lesson[i1],sizeof(lesson[i1]) ); //将data.txt文件读取到lesson指针数组中
}
for(int i2 = 0;i2 < nCount2;i2++){
fin.read( (char*)&student[i2],sizeof(student[i2]) ); //将data.txt文件读取到student指针数组中
}
for(int i3 = 0;i3 < nCount3;i3++){
fin.read( (char*)&grade[i3],sizeof(grade[i3]) ); //将data.txt文件读取到grade指针数组中
}

fin.close();

for(int i4 = 0;i4 < nCount1;i4++){
m_ptrArray1.Add(&lesson[i4]); //将lesson指针数组保存到m_ptrArray1中
}
for(int i5 = 0;i5 < nCount2;i5++){
m_ptrArray2.Add(&student[i5]); //将student指针数组保存到m_ptrArray2中
}
for(int i6 = 0;i6 < nCount3;i6++){
m_ptrArray3.Add(&grade[i6]); //将grade指针数组保存到m_ptrArray3中
}
}
展开
 我来答
White_MouseYBZ
推荐于2016-09-28
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
逻辑上好像有点问题:文件是读打开的,读取了3段,分别存到3个地方,无论是否到了文件末尾,文件就被fin.close();关闭了;然后把读取的3段分别存入另3个地方。但以上动作都在循环while (!fin.eof()){...}中,文件被关闭后,下一次却没有再打开的语句,所以只能读取一次文件就被永久关闭了。如果在while (!fin.eof()){...}中再次打开,那么问题又来了:重新打开文件时是从文件开头操作的,那循环什么时候结束呢?代码就无何止地读取前3段而不能退出循环了。建议不要在while (!fin.eof()){...}中关闭文件,把fin.close();移到while (!fin.eof()){...}后面,这样在文件结束时由while (!fin.eof()){...}中的!fin.eof()控制跳出循环,接着再关闭文件,逻辑上就顺当了……
更多追问追答
追问
为什么在读取的时候会内存不足啊,还有我之前是没有加eof的,但是没有出现的问题和现在一样,也是不关闭程序就可以正常读取,关闭了就读取出乱码
追答
类似CLesson这样的标识没有给出声明情况,所以具体说不上为什么……
xoaxa
2014-06-03
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
// .........
fin.clear(); // 加此句。
fin.close();
更多追问追答
追问
不行啊,我之前加过,然后读取数据的时候不知道为什么直接卡死了
追答
ifstream fin("data.txt",ios::binary); // 这是“读”方式打开的
ofstream fout("data.txt",ios::binary); // 这是“写”方式打开的
fstream frw("data.txt",ios::in|ios::out|ios::binary); // 这是“读/写”方式打开的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式