C ++:从二进制文件

时间:2015-05-30 03:10:51

标签: c++

我有以下类声明:

class student
{
    int roll,marks;
    public:
    void input()
      {
        cout<<"Roll:";cin>>roll;
         cout<<"Marks:";cin>>marks;
      }
      void display()
      {
        cout<<"Roll:"<<roll<<endl;
         cout<<"Marks:"<<marks<<endl;
      }
      int retroll()
      {
        return roll;
      }
};

我将3个student类型的记录存储在二进制文件

void writerec()
{
   student a;
   ofstream fout ("student.dat",ios::binary);
   for (int x = 1 ; x<=3 ; x++)
    {
      a.input();
      fout.write((char*)&a,sizeof(a));
   }
}

这是我从文件中读取记录的功能

void readrec()
{
    student a;
    ifstream fin ("student.dat",ios::binary);
    for (int x = 1 ; x<=3 ; x++)
    {
       fin.read((char*)&a,sizeof(a));
       a.display();
    }
}

这是我从文件中删除记录的功能

void deleterec(int r) //takes roll number that needs to be deleted 
{
   student a;
   ofstream fout ("temp.dat",ios::binary);
   ifstream fin ("student.dat",ios::binary);
   while(fin.read((char*)&a,sizeof(a)))
     if(a.retroll()!=r)
        fout.write((char*)&a,sizeof(a));
   fin.close();
   fout.close();
   remove("student.dat");
   rename("temp.dat","student.dat");
}

这是我的主要功能:

void main()
{
   student a;
   writerec();
   deleterec(2);
   cout<<"Record Deleted\n";
   readrec();
}

所以我要删除卷号为2的所有记录。

以下是我的示例输入:

  

辊:2

     

商标:20

     

辊:2

     

商标:20

     

辊:2

     

商标:20

这是我的输出:

  

记录已删除

     

辊:0

     

标记:1

     

辊:0

     

标记:1

     

Roll:0

     

标记:1

所以我的问题是在删除3号卷的3条记录之后,二进制文件如何保留值。为什么标记的值是1?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

您的readrec()函数存在问题

你正在从文件中强行读取三条记录(即使它们不存在)

因此,a.display()显示变量的初始值(因为无法从空文件中读取任何内容)

我认为您需要将readrec()修改为:

 while(fin.read((char*)&a,sizeof(a)))
     a.display();