Sortowanie tekstu wczytanego z pliku .txt

0

Wykorzystując c++ muszę posortować tekst wczytany z pliku save.txt

0

Oj niechcący wysłałem, jak mówiłem muszę posortować tekst z pliku save.txt
zawartość pliku:
63 pkt. --> jakub
11 pkt. --> marian
97 pkt. --> bartek
22 pkt. --> ania
5 pkt. --> józek
18 pkt. --> franek
45 pkt. --> basia
39 pkt. --> gosia
56 pkt. --> zdzisiek

Muszę posortować względem ilości punktów i zapisać do tego samego pliku już posortowane wyniki.
Nie mam pojęcia jak to zrobić :(

0

Nie wiem, ale może traktuj tekst w postaci ASCII czyli jeśli masz np taką budowę pliku:
Mama
Tata
Brat
Siostra

Wczytuj to do wektora, potem sortuj to tak jakbyś sortował liczby tylko zamieniaj sobie każdą literkę w stringu na odpowiednik liczby w ASCII, zsumuj te cyfry i porównaj z stringiem następnym i jak coś to zamień miejscami.

Nie wiem czy takie coś zadziała, ale to tylko taki pomysł.

0

Mówisz, o sortowaniu bąbelkowym, ale mi nie chodzi o to, aby posortować według imion, tylko tych liczb na początku, ale ja coś źle robię i sortuje mi się tylko pierwsza kolumna (tzn. pierwszy znak z każdego wiersza), a reszta pozostaje bez zmian.

2

Zrób klasę złożoną z imienia i ilosci punktów. Przeładuj w tej klasie operator<. Wczytaj do tablicy obiektów tej klasy dane z pliki. Posortuj. Zapisz z powrotem.

0

mogę ci to napisać za 70zł: http://www.programy-na-zamowienie.yoyo.pl/

0

Dzięki 'nnn', ale w końcu sam to zrobię, a może ktoś mi pomoże? Doszedłem do tego punktu, i nie wiem co dalej/co zmienić.

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;
    class zapis
       {
       public:
       char nick[100];
       int wynik;
       };
       
       class zapis2
       {
       public:
       char nick2[100];
       int wynik2;
       };
int main(int argc, char *argv[])
{
    zapis osoba;
    zapis2 osoba2;
    int m = 1;

    fstream plik;
    plik.open( "save.txt", ios::in | ios::out );
    plik.seekg(ios_base::beg );

    if( plik.good() == true )
    {

        while(!plik.eof())
        {
                          plik>>osoba.wynik;
                          plik>>osoba.nick;
                          plik.seekg( + m*'\n', ios_base::beg );

                          plik>>osoba2.wynik2;
                          plik>>osoba2.nick2;
                          m=m+1;
                          if(osoba.wynik>osoba2.wynik2)
                          {
                                                       plik.seekg(ios_base::end);
                                                       plik<<osoba.wynik<<" "<<osoba.nick<<endl<<osoba2.wynik2<<" "<<osoba2.nick2;
                          }
                                                       
                                                                             
        }
        
        plik.close();
    }
    else
    {
        cout<<"ERROR\n";
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
0
  1. Przyjmuje się, że w klasach należy wszystkie pola umieszczać w private, i dać do tego metody.
  2. Po co ci dwie klasy, mające to samo?
  3. Wczytaj do tablicy, i tam sortuj!
0

enjoy:

#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>

#define u32 unsigned int

using namespace std;

//pojedynczy wynik
class Wynik
{
	private:
		u32 _wynik;
		string _nick;
	public:
		Wynik(string&s) ;
		string GetString() ;
		inline u32 GetWynik(){return _wynik;}
};

Wynik::Wynik(string&s) 
{
	istringstream ss(s);
	ss>>_wynik;
	
	_nick=s.substr(s.find_last_of(" ")+1) ;
}

string Wynik::GetString()
{
	ostringstream ss;
	ss<<_wynik<<" pkt. --> "<<_nick; //tutaj mozesz dac inny format
	return ss.str() ;
}

//----------------------------------------------------------------------

class TablicaWynikow
{
	private:
		vector<Wynik*> tab;
		
		static bool Porownaj(Wynik*w1,Wynik*w2){return w1->GetWynik() < w2->GetWynik();}
	public:
		TablicaWynikow(){};
		~TablicaWynikow();
		
		void Odczyt(const char*filename);
		void Zapis(const char*filename);
		
		void Sortuj();
};

TablicaWynikow::~TablicaWynikow()
{
	for(int i=0;i<tab.size();++i)
	{
		delete tab[i];
	}
}

//Odczyt : bez sprawdzania bledow, nie chce mi sie pisac
//wiec lepiej, by byly prawidlowe
void TablicaWynikow::Odczyt(const char*filename)
{
	tab.clear();
	ifstream we(filename);
	if(!we.is_open())
		return ;
	string s;
	while(getline(we,s))
		if(s!="")
		{
			Wynik* _wyn = new Wynik(s) ;
			tab.push_back(_wyn) ;
		}
	we.close() ;
}

void TablicaWynikow::Zapis(const char*filename)
{
	ofstream we(filename);
	for(int i=0;i<tab.size();++i)
		we<<tab[i]->GetString()<<"\n" ;	
	we.close() ;
}

void TablicaWynikow::Sortuj()
{
	sort(tab.begin(),tab.end(),Porownaj) ;
}
	
//----------------------------------------------------------------------		


int main(int argc, char**argv)
{
	TablicaWynikow tw;
	tw.Odczyt("save.txt") ;
	tw.Sortuj() ;
	tw.Zapis("save.txt") ;
	
	return 0;
}

w razie pytań, pytaj

0

Można tak:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std; 

class Punkty
{
private:
	int iPkt;
	string strImie;

public:
	bool operator<(const Punkty& rWart)
	{
		if(iPkt < rWart.iPkt) return true;
		else return false;
	}

	friend ofstream& operator<<(ofstream& out, const Punkty& pkt);
	friend ifstream& operator>>(ifstream& in, Punkty& pkt);
};

ofstream& operator<<(ofstream& out, const Punkty& pkt)
{
	out << pkt.iPkt << " " << pkt.strImie;
	return out;
}

ifstream& operator>>(ifstream& in, Punkty& pkt)
{
	in >> pkt.iPkt;
	getline(in, pkt.strImie);
	return in;
}

int main() 
{ 
	ifstream in("save.txt");
	vector<Punkty> vDane;
	Punkty pktTmp;

	while(in >> pktTmp)
		vDane.push_back(pktTmp);
	in.close();

	sort(vDane.begin(), vDane.end());

	ofstream out("save.txt");

	for(int i = 0; i < vDane.size(); i++)
		out << vDane[i] << endl;
	out.close();
}  
0

OOO, wielki dzięki :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1