Odczytywanie i zapisywanie do pliku oraz sortowanie danych z pliku

2015-03-10 13:00
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;
}

Pozostało 580 znaków

2015-03-10 13:35
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") 
to w tej strukturze nie powinny być tablice ? - nowicjusz35 2015-03-10 13:56
moim zdaniem lepiej będzie jeżeli zrobisz strukturę i dopiero z niej tablicę - mam wrażenie, że trochę odwrotnie to rozumiesz. Na prostym przykładzie -> masz strukturę int która przechowuje liczbę całkowitą i robisz tablicę, żeby przechować ileś intów, tak samo masz strukturę użytkownicy, która przechowuje dane użytkownika i robisz z niej tablicę żeby przechować ileś użytkowników - Sosen 2015-03-10 14:02
chodzi o listę jednokierunkowa ? - nowicjusz35 2015-03-10 15:07

Pozostało 580 znaków

2015-03-10 14:28
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

edytowany 7x, ostatnio: Proxima, 2015-03-10 14:54
Pokaż pozostałe 13 komentarzy
I tak trzeba o milionie rzeczy pamiętać pisząc w C++. Jedna w tę czy w tę nie robi żadnej różnicy, a wszyscy chyba wiemy jak urocze są underscore'y. @Proxima http://www.open-std.org/jtc1/[...]21/docs/papers/2013/n3797.pdf - n0name_l 2015-03-10 15:10
@n0name_l thx, chociaż z draftami to ja już ćwiczyłem i ... ;p - Proxima 2015-03-10 15:19
a po co tutaj funkcja push jak nazwiska są w pliku ? - nowicjusz35 2015-03-10 15:49
Spróbuj wczytać plik na ideone i zastanów sie po raz drugi. - Proxima 2015-03-10 15:50
nawet nie wiem co to jest, w google pokazało kod źródłowy z javy - nowicjusz35 2015-03-10 15:52

Pozostało 580 znaków

2015-03-10 15:08
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 ?

edytowany 2x, ostatnio: nowicjusz35, 2015-03-10 15:15

Pozostało 580 znaków

2015-03-10 15:24
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.

edytowany 1x, ostatnio: Proxima, 2015-03-10 15:24
to trzeba listę jednokierunkową zrobić? - nowicjusz35 2015-03-10 15:35
po kiego grzyba? Nie trzeba robić żadnej listy. - Proxima 2015-03-10 15:35
http://cpp0x.pl/kursy/Kurs-C++/Struktury-danych/303 Poczytaj sobie trochę o temacie, wyżej masz już sporo informacji - Sosen 2015-03-11 09:57

Pozostało 580 znaków

2015-03-12 00:39
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;
}

Pozostało 580 znaków

2015-03-12 18:24
0

Ktoś skomentuje ten powyższy kod ?

Nie ma tam zbyt co komentować. Rozlazłe i brzydkie. - Proxima 2015-03-12 18:27

Pozostało 580 znaków

2015-03-12 20:40
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,'*');

Pozostało 580 znaków

2015-03-12 20:46
1

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

edytowany 1x, ostatnio: Proxima, 2015-03-12 20:47

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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