当前位置:  开发笔记 > 编程语言 > 正文

C++文件处理(结构)

如何解决《C++文件处理(结构)》经验,为你挑选了2个好方法。

下面的代码,当用g ++编译和运行时,打印'1'两次,而我希望'1'只打印一次,因为我将一个结构转储到文件中,但回读时它似乎是读取两个结构.为什么?

#include 
#include 

int main(){
    struct student
    {
        int rollNo;
    };
    struct student stud1;
    stud1.rollNo = 1;

    ofstream fout;
    fout.open("stu1.dat");
    fout.write((char*)&stud1,sizeof(stud1));
    fout.close();

    ifstream filin("stu1.dat");
    struct student tmpStu;
    while(!filin.eof())
    {
          filin.read((char*)&tmpStu,sizeof(tmpStu));
      cout << tmpStu.rollNo << endl; 
    }
    filin.close();
}

Eclipse.. 11

eof 只有在读取失败后才会设置,因此读取运行两次,第二次,它不会修改缓冲区.

试试这个:

while(filin.read((char*)&tmpStu,sizeof(tmpStu)))
{
    cout << tmpStu.rollNo << endl; 
}

要么

while(!filin.read((char*)&tmpStu,sizeof(tmpStu)).eof())
{
    cout << tmpStu.rollNo << endl; 
}

Read在调用时返回对filin的引用,如果流仍然良好,它将评估为true.当读取无法读取任何更多数据时,引用将评估为false,这将阻止它进入循环.



1> Eclipse..:

eof 只有在读取失败后才会设置,因此读取运行两次,第二次,它不会修改缓冲区.

试试这个:

while(filin.read((char*)&tmpStu,sizeof(tmpStu)))
{
    cout << tmpStu.rollNo << endl; 
}

要么

while(!filin.read((char*)&tmpStu,sizeof(tmpStu)).eof())
{
    cout << tmpStu.rollNo << endl; 
}

Read在调用时返回对filin的引用,如果流仍然良好,它将评估为true.当读取无法读取任何更多数据时,引用将评估为false,这将阻止它进入循环.



2> Steve Fallow..:

您的while循环正在执行两次,因为在第一次尝试读取超出文件末尾之前,EOF条件不成立.所以cout执行两次.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有