无法对从 C++ 中的文件读取的对象进行排序

Unable to sort objects read from a file in C++

#include<iostream>
#include<iomanip>
#include<fstream>
#define MAX 30
using namespace std;
int n, i, j, ch;
char ans;
fstream file;

大家好,下面我创建了一个class来维护学生的记录。

class student
{
  char name[20];
public:
  int rln;
  void get()
  {
    cout<<"\nEnter name: ";
    cin>>name;
    cout<<"\nEnter roll no.: ";
    cin>>rln;
  }
  void show()
  {
    cout << right << setw(20) << name << "   " << setw(10) << rln << "\n";
  }
};

下面,我创建了两个对象:一个作为数组,用于按学生的卷数排序,另一个作为临时保存对象。

student s[MAX], u;

下面的函数用于根据对象的卷号参数对对象数组进行排序

void bubble_sort(student s[])
{
  for(i=0;i<n;i++)
  {
    for(j=0;j<n-1;j++)
    {
      if(s[j].rln>s[j+1].rln)
      {
        cout<<"\nHi";
        student temp;
        temp=s[j];
        s[j]=s[j+1];
        s[j+1]=temp;
      }
    }
  }
}

这是主要功能

int main()
{

在这里,我不能选择第一个选项,因为首先我们必须创建一个保存记录的文件。

  cout<<"1.Sort existing file records"
      <<"\n2.Create and sort new set of records"
      <<"\n";
  cin>>ch;


  switch(ch)
  {
    case 1:
    {
      file.open("unsort.txt", ios::binary|ios::in|ios::out);

注意:由于不确定,我只从文件中读取了 3 条记录,但稍后我会增加该数量。我知道我可以使用 while 循环,但我只想说我只想读取 3 条记录。 将每条记录读入临时对象'u'并插入数组对象's[i]'

      for(i=0; i<3; i++)
      {
        file.read((char *)&u, sizeof(u));
        s[i]=u;
      }

显示部分:

      cout<<"\nLook what I found!:\n";
      cout << right << setw(20) << "Name" << "   " << setw(10) << "Roll number\n";
  for(i=0; i<3; i++)
  {
    s[i].show();
  }
  file.close();
  break;
}

用于创建新记录的案例 2,与案例 1 几乎相同...除了我要先截断未排序的文件...

case 2:
{
  file.open("unsort.txt", ios::binary|ios::trunc|ios::out);
  cout<<"\nNumber of records: ";
  cin>>n;
  for(i=0; i<n; i++)
  {
    u.get();
    s[i]=u;
    file.write((char *)&u, sizeof(u));
  }
  file.close();
  cout<<"\nYour input:\n";
  cout << right << setw(20) << "Name" << "   " << setw(10) << "Roll number\n";
      for(i=0; i<n; i++)
      {
        s[i].show();
      }
      break;
    }
  }

排序是这样的:

  cout<<"\nChoose sorting method:"
      <<"\n1.Bubble Sort"
      <<"\n";
  cin>>ch;

在情况 1 中,我打开了一个新文件来存储排序的记录 - 请注意:

  switch(ch)
  {
    case 1:
    {
      file.open("sort.txt", ios::binary|ios::trunc|ios::out);

然后,我使用要排序的 's' 数组调用 bubble_sort 函数:

      bubble_sort(s);
      cout<<"\nSorted:\n";
      cout << right << setw(20) << "Name" << "   " << setw(10) << "Roll number\n";

重要部分:希望这种排序对案例 2 非常有效,即对于新创建的记录。但是当从以前存储的未排序记录文件中读取时,它不会输出任何内容。怎么了?

      for(i=0; i<n; i++)
      {
        s[i].show();
        file.write((char *)&s[i], sizeof(s[i]));
      }
      file.close();
      break;
    }
  }
  return 0;
}

全局变量很容易忘记。这里情况1,n没有初始化为记录数,保持初始化值0。所以你排序显示一个空数组。

只需将读取部分更改为:

  for(i=0; i<3; i++)
  {
    file.read((char *)&u, sizeof(u));
    s[i]=u;
  }
  n = 3;   // <- do not forget it!

足以解决问题。

但我的建议是删除全局变量并将其显式传递给排序函数。