2017-10-27 1 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"; 
    } 
}; 

以下、2つのオブジェクトを作成します.1つは、生徒のロール番号で並べ替える配列、もう1つは一時的な保持オブジェクトです。

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

、私は「S」配列とbubble_sort関数を呼び出します:ケース1では

cout<<"\nChoose sorting method:" 
     <<"\n1.Bubble Sort" 
     <<"\n"; 
    cin>>ch; 
は、私はそれを注意してくださいソートrecords-を保存するために、新しいファイルを開いた

 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ローカルの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

ちょっとSerge Ballesta、あなたのソリューションは完全にトリックでした!どうもありがとう!あなたと@SlavaはC++の理解を助けてくれました –

関連する問題