2017-10-27 5 views
0
#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; 
} 
+0

전역'std :: fstream' 객체를 사용하지 말고 대신 필요한 곳에 로컬 객체를 생성하십시오.프로그램이 더 깨끗해지고 문제가 사라집니다. – Slava

+0

정말 긴 게시물에 대해 유감스럽게 생각합니다.하지만이 커뮤니티를 처음 접했고 어떤 부분을 잘라낼 수 있는지 알지 못했습니다. –

+0

@Slava local std :: fstream 객체는 각 스위치 케이스에서와 같이? –

답변

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! 

하면 문제를 제거하기에 충분하다.

하지만 내 조언은 전역 변수를 제거하고 명시 적으로 정렬 함수에 전달하는 것입니다.

+0

안녕 세르지 Ballesta, 당신의 솔루션은 완전히 트릭을 했어! 고마워요! 당신과 @Slava는 C++에 대한 이해를 돕습니다. –