Poprawa sortowania pliku C++

0

Mam taki kod:

#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
     string nazwaPliku;
     cout << "Podaj nazwe pliku do otwarcia: ";
     cin >> nazwaPliku;
     ifstream plikwe(nazwaPliku.c_str());
     if(!plikwe)
     {
          cerr << "Blad otwarcia pliku\n";
          return -1;
     }
 
     string tmp;
     vector<string> tekst;
     while(plikwe >> tmp)
     {
          tekst.push_back(tmp);
     }
 
     cout << "Przed usunieciem duplikatow\n";
     for(int i = 0; i < tekst.size(); ++i)
     {
          cout << tekst[i] << "\n";
     }
     // najpierw sortujemy slowa, bo algorytm unique "usuwa" tylko
     // slowa lezace obok siebie
    // sort(tekst.begin(),tekst.end());
    
    for (int i = 0; i < tekst.size(); i++)
    for (int j = i+1; j < tekst.size(); j++)
    if (tekst[i] > tekst[j]) swap(tekst[i], tekst[j]);
     // algorytm unique przenosi duplikaty na koniec, i zwraca nowy logiczny
     // koniec. Aby usunac calkowicie z kontenera duplikaty
     // stosujemy metode erase.
     tekst.erase(unique(tekst.begin(),tekst.end()),tekst.end());
 
     cout << "Po usunieciu duplikatow\n";
     for(int i = 0; i < tekst.size(); ++i)
     {
          cout << tekst[i] << "\n";
     }
 
     cout << "Podaj nazwe pliku do ktorego zapisac\n";
     cin >> nazwaPliku;
     ofstream plikwy(nazwaPliku.c_str());
 
     for(int i = 0; i < tekst.size(); ++i)
     {
          plikwy << tekst[i] << "\n";
     }
 
 
}

I ani przez zakomentowane sort ani przez bombelkowe nie sortuje mi liczb poprawnie. Przykładowo mam dane:

1
10
600
50
1000

Mają być one wyświetlone w ten sposób:
1
10
50
600
1000

Aha i jeszcze jedno w moim pliku z jakiegoś powodu znajdują się wartosci liczbowe ze średnikiem : np. 5055; i 5055 Jak zrobić by takie dublikaty też były usuwane ?

Tzn np:

5055;
5055
600
601;

ma wypisać w pliku:
600
601
5055

tak by nie duplikat ze średnikiem pozostał bez średnika zapisany a duplikat się usunął :)
Dzięki za pomoc.

1

Konwersja string na int i odwrotnie: Konwersje int na string i string na int

Później jakaś funkcja porównująca:

 
string check(string temp){
	if(temp[temp.length()-1] == ';'){
		temp = temp.substr(0, temp.length()-1);
	}
	return temp;
}

Funkcja zwraca string bez ostatniego średnika.

Dalej, składasz to wszystko do kupy. Konwersje + funkcje i bingo!

Dodam że mam 16 lat i uczę się programowania sam więc przepraszam za ewentualne nieścisłości.

2

Ja tu nigdzie nie widze konwersji stringa do inta. Porownujesz stringi wiec nic dziwnego ze zle sortuje.

2
//...
string tmp;
set<int> liczby_sortowane;
while(plikwe >> tmp)
{
    tmp = check(tmp);
    liczby_sortowane.insert(atoi(tmp.c_str()));
}
// tylko do testu
cout << "po sortowaniu:\n";
copy(liczby_sortowane.begin(), liczby_sortowane.end(), ostream_iterator<int>(cout, "\n"));
//...

I tyle.

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