2016-10-21 19 views
0

私は特定の方法で編成されたビデオゲームの文字のリストを持っています。 私はその名前だけをリストから取り出し、アルファベット順に並べ替えることができたいと思っています。アルファベット順に並べ替えるC++

リストがでフォーマットされます。リストがある

Last Name, First Name, Game, Relase Date, Score, Developer 

Snake, Solid, Metal Gear Solid, 9/3/1998, 94, Konami 
Drake, Nathan, Uncharted, 11/19/2007, 90, Naughty Dog 
Guy, Doom, Doom, 5/13/1993, 95, iD 

私が欲しいの出力は次のようになります。

Drake, Nathan 
Guy, Doom 
Snake, Solid 

私だけでそこに名前をプリントアウトすることができますそれらがテキストファイル内にある順序。どのように私は姓を比較し、フルネームをプリントアウトするのですか?ここで

は、これまでの私のコードです:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <time.h> 
#include <cstdlib> 
#include <sstream> 
using namespace std; 

ifstream inFile; 

class Characher{ 
private: 
    string first; 
    string last; 
public: 
    Character(){}; 

    void getLast(){ 
    if(inFile.is_open()){ 
     getline(inFile, last,','); 
    } else { 
    cout<<"Hmm.."<<endl; 
     } 
    } 

    void getFirst(){ 
    if(inFile.is_open()){ 
     getline(inFile, first,','); 
    } else { 
    cout<<"No First Name here..."<<endl; 
     } 
    } 

    void printLast(){ 
    cout<<last<<","; 
    } 

    void printFirst(){ 
    cout<<first<<endl; 
    } 
}; 

class Dev{ 
private: 
    string Developer; 
public: 
    Dev(){};//null constructor 

    void printDeveloper(){ 
    cout<<"Developer: "<<Developer<<endl; 
    } 

    void getDeveloper(){ 
    if(inFile.is_open()){ 
     getline(inFile, Developer); 
    } else { 
    cout<<"Nothing here..."<<endl; 
    } 
    } 
}; 
class Game{ 
private: 
    string game; 
public: 
    Game(){}; 

    void getGameName(){ 
    if(inFile.is_open()){ 
     getline(inFile, game,','); 
     } else{ 
     cout<<"What game was they frum?"<<endl; 
     } 
    } 

    void printGame(){ 
    cout<<"Game: "<<game; 
    } 

}; 

class RelDate_And_Score{ 
private: 
    string ReleaseDate; 
    string Score; 
public: 
    RelDate_And_Score(){}; 

    void GetRelDate(){ 
    if(inFile.is_open()){ 
     getline(inFile, ReleaseDate, ','); 
    } else{ 
    cout<<"Could not find Release Date"<<endl;} 
    } 

    void getScore(){ 
    if(inFile.is_open()){ 
     getline(inFile, Score, ','); 
    } else{ 
    cout<<"Could not find Score"<<endl;} 
    } 

    void PrintDate(){ 
    cout<<"Release Date: "<<ReleaseDate<<" | ";} 

    void PrintScore(){ 
     cout<<"Score: "<<Score<<endl;} 

}; 

int main(){ 
    inFile.open("Games.dat"); 

    Dev d; 
    Characher c; 
    RelDate_And_Score r; 
    Game g; 

    for (int i=0; i<3; i++) 
    { 
     c.getLast(); 
     c.getFirst(); 
     g.getGameName(); 
     r.GetRelDate(); 
     r.getScore(); 
     d.getDeveloper(); 
     c.printLast(); 
     c.printFirst(); 
    } 

    return 0; 
} 
+1

にはstd ::並べ替えを使用することができます。文字クラスなどでオペレータ<を実装します。 //en.cppreference.com/w/cpp/algorithm/sort)?あなたのオブジェクトに 'operator <'を定義するか、それらを比較できる 'Compare'関数を書いてください。 – tadman

+0

ファイルの順序を変更することはできません。そのため、メモリ内にコピーが必要です。マップを作成し、マップにすべての行を追加し、その名前をキーとします。マップ上のループでソートされたものが表示されます – Lanting

+0

文字、ゲーム、日付などの異なるクラスを使用したデザインで、各クラスを開き、グローバルファイルオブジェクトにアクセスすると、必要以上に複雑になります。同じ行を読むことで干渉します。文字、ゲーム、...などの文字列メンバーを1行に1つのクラスインスタンスを持つ方が簡単です(これらのクラスのインスタンスをベクターに入れます(ループ内で番号3を使用せず、柔軟に保つ)。ベクトルに対して 'std :: sort'を使います。 –

答えて

0

私はあなたがそれぞれの方法(GetLastの()など)用のファイルを直接操作ご覧ください。これは、ファイルへのアクセスがコストがかかり、効率が悪いため、これを実行する最善の方法ではありません。

あなたは、メモリ内のファイルの表現を構築する必要があります。ような文字クラスとして、各行を表すから始め:

class Character 
{ 
    public: 
    Character(const string & firstname, const string & secondname, const string & game, const string & releasedate, const string & score, const string & developer) 
    : 
    m_firstname(firstname), m_secondname(secondname), m_game(game), m_releasedate(releasedate), m_score(score), m_developer(developer) 
    {} 

    private: 

    string m_firstname, m_secondname, m_game, m_releasedate, m_score, m_developer; 
}; 

は(ファイルを開き、各行を読み取り、解析された文字列を使用して文字を構築しますカンマ区切り)。

コメントで提案されたtadmanは、std::sortメソッドを使用して名前で文字を並べ替えることができます。

class Character 
{ 
    //... 
    bool operator<(const Character & c) 
    { 
     return m_firstname < c.m_firstname; 
    } 
    //... 
}; 

だからあなたは[ `のstd :: sort`](httpで意味あなたvector<Character> m_characters

std::sort(m_characters.begin(), m_characters.end()); 
関連する問題