无法对从 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!
足以解决问题。
但我的建议是删除全局变量并将其显式传递给排序函数。
#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!
足以解决问题。
但我的建议是删除全局变量并将其显式传递给排序函数。