Sortowanie wierszy według jednego stringa opisującego dzień tygodnia w C++

0

Witam, tworząc projekt na zajęcia z programowania trafiłem na problem, którego nie potrafię przejść.
Mam plik tekstowy, w którym znajdują się takie informacje:
07:23-19:34 cz gr1 Astronomia
10:15-11:45 wt gr2 Fizyka

Muszę teraz posortować dane w tym pliku w taki sposób, by linia w której znajduję się "wt" była nad "cz", czyli inaczej mówiąc po prostu chronologicznie wg. dnia tygodnia. Oczywiście takich linijek może być dużo więcej i dni tygodnia zapisywane są : "pn,wt,sr,cz,pt,sb,nd" a jeżeli pojawią się zajęcia, które są w tym samym dniu to muszą być posortowane wg. godziny w której mają miejsce.Mój kod źródłowy na tym etapie wygląda tak:

#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <sstream>
using namespace std;
struct dane                  //struktura z danymi i wskaznikiem na nastepny element
{
	string godzina;
	string dzien;
	string grupa;
	string nazwisko;
	string przedmiot;
	dane *nast;
};
typedef dane* lista;
lista glowa = NULL;
lista wsk = NULL;
void dodawanie(lista &glowa, string godzina, string dzien, string grupa, string nazwisko, string przedmiot) // dodawanie nowego elementu do listy
{
	glowa = new dane;
	glowa->godzina = godzina;
	glowa->dzien = dzien;
	glowa->grupa = grupa;
	glowa->nazwisko = nazwisko;
	glowa->przedmiot = przedmiot;

	glowa->nast = wsk;
	wsk = glowa;

};
void zapisz(lista glowa)//zapisywanie listy do osobnego pliku
{

	lista kolejny;
	kolejny = glowa;
	while (kolejny != NULL)
	{
		fstream plik_wyjsciowy;
		plik_wyjsciowy.open(kolejny->nazwisko + ".txt", ios::out | ios::app);
		plik_wyjsciowy << kolejny->godzina << " ";
		plik_wyjsciowy << kolejny->dzien << " ";
		plik_wyjsciowy << kolejny->grupa << " ";
		plik_wyjsciowy << kolejny->przedmiot << endl;
		kolejny = kolejny->nast;
	}
	cout << "\n";
};


int main()
{
	fstream plik;
	string sciezka;
	cout << "Wpisz nazwe/sciezke do pliku zawierajcego dane:";
	cin >> sciezka;
	plik.open(sciezka);
	if (plik.is_open())
	{
		string wers;
		string godzina, dzien, grupa, nazwisko, przedmiot;
		cout << "Plik wczytano poprawnie!" << endl;
		int liczby;
		string a, b;
		while (!plik.eof())
		{

			getline(plik, wers);
			istringstream is(wers);   //dzielenie wersu  na czesci
			is >> godzina >> dzien >> grupa >> nazwisko >> przedmiot;

			dodawanie(glowa, godzina, dzien, grupa, nazwisko, przedmiot);  //dodanie pobranych danych z pliku do listy

		}
	}
	else
	{
		cout << "Plik nie zostal wczytany, sprobuj ponownie" << endl;
	}

	zapisz(glowa);
	return 0;
}

Widziałem już podobny temat na forum, chłopak chyba miał ten sam temat projektu co ja tylko inaczej wtedy wyglądał. Ja muszę stworzyć pliki dla każdego osobnego wykładowcy i do tych plików z jego nazwiskiem umieścić jego zajęcia, a zajęcia mają być posortowane chronologicznie. Z tego co widziałem jemu się to nie udało. Muszę nadmienić, że w warunkach projektu zakazane jest używanie publicznych kontenerów typu vector, czy list.

1

A std::sort() możesz używać?
Jeśli tak to zadanie wykonasz takowym sposobem Bracie:

  • implementujesz operator< dla struktury dane jako zewnętrzną funkcję, tak aby porównywał te pola jakie potrzebujesz
  • wczytujesz z pliku wszystko do dużego bufora char[] przy pomocy ifstream::read()
  • ten duży bufor możesz potraktować jako tablicę struktur dane
  • przekazujesz do std::sort jako pierwszy parametr początek bufora, jako koniec obliczony indeks ostatniej struktury
  • po posortowaniu masz duży bufor z poukładanymi strukturami według porządku określanego przez operator<
  • zapisujesz cały bufor do pliku

Przykład powodujący wywrotkę aplikacji bo ja w buforze tak naprawdę nie mam obiektów dane, ale obrazujący ideę:
https://onlinegdb.com/SJ2bfopGE

0

Po pierwsze musisz sparsować ten czas.
Takie coś wczytuje mi dane poprawnie, tylko jeśli dzień tygodnia jest trzyliterowy (np "czw"):

#include <iostream>
#include <locale>
#include <iomanip>

int main()
{
    std::tm start;
    std::tm stop;
    std::string grupa;
    std::string przedmiot;
    std::cin .imbue(std::locale("pl_PL"));
    if (std::cin
        >> std::get_time(&start, "%H:%S-")
        >> std::get_time(&stop, "%H:%S %a")
        >> grupa >> przedmiot)
    {
        std::cout << "Ok\n";
    }
    else
    {
        std::cout << "Problem\n";
    }
    start.tm_wday = stop.tm_wday;
    std::cout << "Start: " << std::put_time(&start, "%H : %S %a") << std::endl;
    std::cout << " Stop: " << std::put_time(&stop, "%H : %S %a") << std::endl;
    return 0;
}

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