Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie danych do pliku

Ostatnio zmodyfikowano 2015-09-01 20:01
Autor Wiadomość
aidwhoe
Temat założony przez niniejszego użytkownika
Sortowanie danych do pliku
» 2015-09-01 13:16:45
Witam, mam pewne zadanko, w którym trzeba wczytać dane z pliku, a następnie zapisać w drugim, z tym, że dane mają być posortowane wg kolejno : nazwiska, imienia i miejsca zamieszkania. I właśnie z sortowaniem mam problem, nie wiem, jak do tego mógłbym podejść. Jak na razie zapisywanie do pliku we wskazanej kolejności działa całkiem nieźle.

C/C++
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <sstream>

using namespace std;

struct Osoba
{
    string imie;
    string nazwisko;
    string miasto;
    string stanowisko;
    Osoba() { }
    Osoba( string imie_, string nazwisko_, string miasto_, string stanowisko_ )
        : imie( imie_ )
         , nazwisko( nazwisko_ )
         , miasto( miasto_ )
         , stanowisko( stanowisko_ )
    { }
   
    friend ostream & operator <<( ostream & out, const Osoba & o1 );
};

ostream & operator <<( ostream & out, const Osoba & o1 )
{
    out << o1.imie << " " << o1.nazwisko << " " << o1.miasto << " " << o1.stanowisko;
    return out;
}

Osoba wczytajOsobe( string linia )
{
    Osoba os;
    string Lp;
    istringstream s( linia );
   
    getline( s, os.stanowisko, ',' );
    getline( s, Lp, ',' );
    getline( s, os.imie, ',' );
    getline( s, os.miasto, ',' );
    getline( s, os.nazwisko, ',' );
   
    return os;
}

vector < Osoba > wczytajPlik( string wejsciowy )
{
    ifstream wejscie;
   
    string imie;
    string nazwisko;
    string miasto;
    string stanowisko;
    string lp;
   
    string linia;
   
    vector < Osoba > wynik;
    wejscie.open( wejsciowy );
    if( !wejscie.is_open() )
         cout << "Niepoprawna nazwa pliku wejsciowego." << endl;
   
    while( !wejscie.eof() )
    {
        getline( wejscie, linia );
       
        if( wejscie && linia != "" )
             wynik.push_back( wczytajOsobe( linia ) );
       
    }
    wejscie.close();
    return wynik;
}

void zapiszDoPliku( string nazwaPliku, const vector < Osoba > & o )
{
    ofstream wyjscie;
    wyjscie.open( nazwaPliku );
   
    if( !wyjscie.is_open() )
         cout << "Niepoprawna nazwa pliku wyjsciowego" << endl;
   
    int n = o.size();
    for( int i = 0; i < n; i++ )
         wyjscie << i << " " << o[ i ] << endl;
   
    wyjscie.close();
}

int main()
{
    vector < Osoba > w = wczytajPlik( "plikZawody.csv" );
    zapiszDoPliku( "wyniki.txt", w );
   
    return 0;
}

A tutaj jest plik, z którego należy dane wczytać : bit.ly/15sY7eE.

Czy macie może jakieś sugestie, pomysły, jakby to można było zrobić ?
P-137118
michal11
» 2015-09-01 17:16:02
Jeżeli dobrze zrozumiałem to:
1. posortuj cały vektor po nazwisku
2. posortuj kolejne grupy nazwisk po imieniu
3. posortuj te mniejsze grupy po miejscu zamieszkania

Mam nadzieję, że ktoś ma lepszy pomysł, bo złożoność tego rozwiązanie nie jest zbyt fajna.
P-137121
aidwhoe
Temat założony przez niniejszego użytkownika
» 2015-09-01 20:01:32
OK, mniej więcej wiedziałem, że o to chodzi, ale poczytałem o sortowaniu wektora. Oto, do czego doszedłem :

C/C++
bool porownanie( const Osoba & x, const Osoba & y )
{
    return x.nazwisko < y.nazwisko ||(( y.nazwisko == x.nazwisko ) && x.imie < y.imie ) ||(( y.nazwisko == x.nazwisko ) &&( x.imie == y.imie ) && x.miasto < y.miasto );
}
.
.
.
sort( wynik.begin() + 1, wynik.end(), porownanie );

Otóż zdefiniowałem sortowanie wektora logicznie (tak, jak widać, wydaje się być przejrzyste), a następnie dodałem przed zwróceniem tegoż wektora komendę sort, określając początek + 1 (bo 1. linijka jest linijką określającą typy danych), później koniec i metodę, względem jakiej następuje porównanie.

Dziękuję bardzo za nakierowanie :)
P-137127
« 1 »
  Strona 1 z 1