#include<iostream>
#include<iomanip>
#include<fstream>
#define MAX 30
using namespace std;
int n, i, j, ch;
char ans;
fstream file;
안녕하세요, 저는 학생 기록을 유지하는 수업을 만들었습니다.C++에서 파일에서 읽은 개체를 정렬 할 수 없습니다.
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;
아래의 기능이 여기서 기본 기능
int main()
{
그들의 롤 번호 파라미터
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;
}
}
}
}
에 기초하여 오브젝트의 배열을 정렬하는 데 사용된다 못해 첫 번째 옵션을 선택하십시오. 먼저 레코드가있는 파일을 만들어야합니다.
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 개의 레코드 만 읽으 려한다고 가정 해 봅시다. 거의 새로운 레코드를 생성
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 : 'U'임시 객체로 각 레코드를 판독하고 배열 오브젝트의 [I]
for(i=0; i<3; i++)
{
file.read((char *)&u, sizeof(u));
s[i]=u;
}
표시부에 삽입 samelike 것을 내가 먼저 정렬되지 않은 파일을 절단하고있어 제외의 경우 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;
}
}
분류는 다음과 같이 진행됩니다
정렬 할 다음switch(ch)
{
case 1:
{
file.open("sort.txt", ios::binary|ios::trunc|ios::out);
, 나는 '의'배열 bubble_sort 함수를 호출 : 경우 1에서
cout<<"\nChoose sorting method:"
<<"\n1.Bubble Sort"
<<"\n";
cin>>ch;
, 나는 점에 유의하시기 바랍니다 정렬 개인 기록을 저장하기 위해 새 파일을 열었습니다
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
정말 긴 게시물에 대해 유감스럽게 생각합니다.하지만이 커뮤니티를 처음 접했고 어떤 부분을 잘라낼 수 있는지 알지 못했습니다. –
@Slava local std :: fstream 객체는 각 스위치 케이스에서와 같이? –