【问题标题】:Unable to sort objects read from a file in C++无法对从 C++ 文件中读取的对象进行排序
【发布时间】:2017-10-27 13:17:22
【问题描述】:
#include<iostream>
#include<iomanip>
#include<fstream>
#define MAX 30
using namespace std;
int n, i, j, ch;
char ans;
fstream file;

大家好,下面我创建了一个类来保存学生的记录。

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;
}

【问题讨论】:

  • 不要使用全局std::fstream 对象,而是在需要的地方创建本地对象。它会让你的程序更干净,让你的问题消失。
  • 很抱歉这篇很长的帖子,但我是这个社区的新手,不知道我可以剪掉哪些部分。
  • @Slava local std::fstream objects as in for each switch case?
  • 是的,不是std::fstream,而是需要输入的std::ifstream和需要输出的std::ofstream
  • 您将使用std::ifstream file("unsort.txt", ios::binary|ios::in); 而不是file.open("unsort.txt", ios::binary|ios::in|ios::out);,并且您不必显式关闭它,析构函数会处理它。

标签: c++ class sorting object file-handling


【解决方案1】:

全局变量很容易忘记。这里在情况 1 中,n 没有初始化为记录数并保持其初始化值 0。因此您排序并显示一个空数组。

只需将读取部分更改为:

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

足以解决问题。

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

【讨论】:

  • 嘿,Serge Ballesta,您的解决方案完全成功了!非常感谢!你和@Slava 真的帮助我更多地理解了 C++
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2015-02-26
  • 2013-06-06
相关资源
最近更新 更多