| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 700 人关注过本帖
标题:关于另一个文件读写问题
只看楼主 加入收藏
tonlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2009-10-14
结帖率:69.23%
收藏
 问题点数:0 回复次数:4 
关于另一个文件读写问题
程序代码:
#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;
}
程序目的往文件写入学生信息,然后在从文件读出学生信息。如果没有读到文件尾就读出信息否则关闭文件。但是为什么多读了一些内容?
搜索更多相关主题的帖子: 文件 
2010-05-27 15:54
LUNNAN
Rank: 2
等 级:论坛游民
帖 子:30
专家分:44
注 册:2010-5-23
收藏
得分:0 
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;
}
2010-05-27 22:59
ciweitou163
Rank: 7Rank: 7Rank: 7
来 自:河北 石家庄
等 级:黑侠
威 望:1
帖 子:144
专家分:528
注 册:2008-10-4
收藏
得分:0 
学习了!
the EOF flag cannot be used as a test in a loop intended to read all stream contents until EOF.


  • 满眼生机转化钧;天工人巧日争新。
2010-05-28 08:19
tonlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2009-10-14
收藏
得分:0 
回复 2楼 LUNNAN
嗯我也找到了这个 还是要谢谢你啊
2010-06-02 23:29
回忆不是我的
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-03 10:06
快速回复:关于另一个文件读写问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033345 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved