【发布时间】: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