Odczytywanie i zapisywanie do pliku oraz sortowanie danych z pliku

0

Próbuje napisać program, w którym otwieram plik tekstowy(tworzę go sam) w którym mam w jednej linii podane imię,nazwisko,wiek,skuteczność. Jeśli imię ma więcej niż 3 litery, nazwisko kończy się na ski oraz ta osoba ma największą skuteczność to jej dane mam wpisać do nowego pliku. Mam problem jak w pliku posortować skuteczność. I w tym pliku nazwisko ma się zmienić na taki zapis: "Kowalski" => "K****ski" - pierwsza i 3 ostatnie litery zostają a w miejsce innych zostają wpisane *.

Na razie tyle stworzyłem:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream plik;
    plik.open("C:\\plik\\pliczek.txt");
    string imie;
    string nazwisko;
    float skutecznosc;

    if(plik.good())
    {
        cout << "Udalo sie utworzyc plik" << endl;

    }
    else
    {
        cout << "Plik nie zostal otworzony" << endl;
    }

    while(!plik.eof())
    {

        for(int i = 0; i < !plik.eof() ; ++i)
        {
            plik >> imie >> nazwisko >> skutecznosc;

            if((imie.length() > 3) && (nazwisko.substr(nazwisko.length() - 4,nazwisko.length() - 1) == "ski"))
            {
                
            }

        }
    }
        return 0;
}
0

Najlepiej byłoby chyba, żebyś stworzył oddzielną strukturę np.

struct uzytkownicy {
  string imie;
  string nazwisko;
  int wiek;
  int skutecznosc;
}; 

i na początku wpisał cały plik do niej
Potem po prostu wyszukujesz osobę z największą skutecznością i sprawdzasz czy spełnia ww wymagania.

uzytkownicy lista[10]
if(lista[0].nazwisko == "coś tam") 
1
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
std::string postfix = "ski";
string transformers(const std::string &s){
	std::string buf = s;
	size_t find = s.find(postfix, s.length() - postfix.length());
	if(find != std::string::npos){
		buf.replace(1, find-1,buf.length() - postfix.length() - 1, '*');
	}
	return buf;
}
int main()
{
	std::vector<string> ziomy;
	ziomy.push_back("Kowalski");
	ziomy.push_back("Wachowski");
	ziomy.push_back("Pejowski");
	ziomy.push_back("Andrzejewski");
	ziomy.push_back("Zdzislawsko");
	ziomy.push_back("Andrzejek");
	std::transform(ziomy.begin(), ziomy.end(), ziomy.begin(), transformers);
	for(auto it : ziomy){
		std::cout << it << endl;
	}
}
 

https://ideone.com/0zb2xm

0

A tym moim kodem to źle jest ? Bo potem w ifie nie wiem co zrobić czy do tablicy przypisywać te osoby które spełniają warunki ? I jak posortować skuteczność w pliku ? Do tego aby pierwsza litera nazwiska i trzy ostatnie zostały a w inne zostały wpisane * mogę użyć biblioteki string i funkcji replace ?

0

Tak jak masz w poscie wyżej możesz zrobić.
Co do sortowania to najłatwiej chyba będzie jak zrobisz strukture jak pisał @Sosen, w vector ją załadujesz, i zdefiniujesz tej strukturze operator == i potem std::sort.

0

Napisałem ten program oparty tyle na instrukcjach warunkowych if. Jeszcze tylko muszę zmienić stringa nazwisko w 2 pliku. Co sądzicie o tym kodzie:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream file;
    file.open("C:\\plik\\pliczek.txt");

    ofstream file_edit;
    file_edit.open("C:\\plik\\pliczek.max.txt");

    string name;
    string surname;
    int age;
    float efficacy_previous = 0;
    float efficacy_current;

    while(!file.eof())
    {

        for(int i = 0; i < !file.eof() ; ++i)
        {
            file >> name >> surname >> age >> efficacy_current;

            if((name.length() > 3) && (surname.substr(surname.length() - 3,surname.length() - 1) == "ski") && (efficacy_current > efficacy_previous))
            {
                file_edit << name << " " << surname << " " << efficacy_current << endl;
                efficacy_previous = efficacy_current;
            }
            if((name.length() > 3) && (surname.substr(surname.length() - 3,surname.length() - 1) == "ski") && (efficacy_current == efficacy_previous))
            {
                file_edit << name << " " << surname << " " << efficacy_current << endl;
            }
        }
    }
        return 0;
}
 
0

Ktoś skomentuje ten powyższy kod ?

0

Chcę między pierwszą literą a trzema ostatnimi wstawić * w te inne litery, dlaczego mi nie działa tak:

 surname.replace(2,surname.length() - 4,'*');
1

Bo źle tego używasz.
http://www.cplusplus.com/reference/string/string/replace/
Spójrz tu, na wariant funkcji fill - tam jest odpowiedź.

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