• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Fstream odczyt pliku tekstowego mnozenie przez siebie poszczegolnych linii

VPS Starter Arubacloud
0 głosów
448 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez Bulbi Początkujący (250 p.)

Napisałem prosty kod 

        cout << "Wyplate ktorego pracownika chcesz zobaczyc ? : " << endl;
        cin >> nazwa_p;
        nazwa_p+=".txt";

        int nr_linii=1;
        string pensja;
        string linia;
        fstream plik;
        plik.open(nazwa_p, ios::in);
        if(plik.good() == true)
        {
        while(!plik.eof())
        {
            getline(plik, linia);
            nr_linii = pensja; // już nie miałem pomysłu 
            nr_linii++;
        }
        plik.close();
        }

Chciałbym aby program pobrał pierwszą linie kodu ( która jest traktowana jako stawka godzinowa pracownika), zapamiętał ją sobie dodał do ciebie wszystkie pozostałe linie kodu (godziny pracownika), a potem wynik sumy liczb pomnożył przez tą pierwszą liczbę.Można też stworzyć jakąś alternatywe do tego niestety nie mam pomysłu na napisanie takiej pętli aby pobierała linie od 2 dodawała 2 z 3 itd a na końcu wymnożyła się z pierwszą linią pliku.txt. Chętnie zapoznam się z jakimikolwiek pomysłami, mogą być delikatne podpowiedzi, a jeśli ktoś poda gotowe rozwiąznie to z chęcią przyjme je z wyjaśnieniem. Z góry dzięki za pomoc :)

komentarz 13 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
uzyj bazy danych
komentarz 13 sierpnia 2019 przez Bulbi Początkujący (250 p.)
Odeślesz do jakiegoś dobrego poradnika gdzie mogę o tym poczytać  (nie wiem dokładnie o jaki typ tych baz danych chodzi, nie przerabiałem tego jeszcze )? Dzięki za pomoc
komentarz 13 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
Nie wiem czy to musi byc na sile plik czy mozesz uzyc bazy danych ja polecalby LiteSQL
komentarz 13 sierpnia 2019 przez Bulbi Początkujący (250 p.)
Z tego co widze to juz programowanie obiektowe nie ma na to innego sposobu ? Tak jak pisalem wyzej zeby dodawalo wszystkie godziny (czytajac od 2 linii kodu do samego konca ) a potem mnozylo przez pierwsza ?
komentarz 13 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Proponowanie bazy danych to tego prostego zadania to nieporozumienie.

@Bulbi, pokaż, jak wygląda zawartość pliku. W jakiej formie jest stawka godzinowa i czas.

1 odpowiedź

0 głosów
odpowiedź 13 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
Ważne: Po wczytaniu linii musisz przekonwertować ją na liczbę (http://www.cplusplus.com/reference/string/stoi/).
Algorytm:
1. Wczytujesz stawkę
2. Ustawiasz liczbę przepracowanych godzin na 0
3. Dopóki możesz wczytać linię dodawaj wczytaną wartość do liczby przepracowanych godzin
4. Przemnóż stawkę przez liczbę przepracowanych godzin i wyświetl wynik
komentarz 18 sierpnia 2019 przez Bulbi Początkujący (250 p.)
edycja 18 sierpnia 2019 przez Bulbi

Okay dzieki wielkie ostatnie pytanie jest takie, dlaczego jeśli w pliku txt pracownik ma np. 10 zl stawke na godzine i nastepnie ma

30h

40h

50h

to liczy tylko 10*30 = 300

nie dodaje sumy liczb 30+40+50= 120*10

Mam nadzieje ze ci to wytlumaczylem

edit Jeśli nie wpisywał byś

std::ifstream ifs(nazwa_p);

Tylko zwyczajne 

ifstream ifs(nazwa_p);

To byłby błąd ?

komentarz 18 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

dlaczego (...) nie dodaje sumy liczb

Dlatego tak się dzieje, bo po liczbie jest litera h, a kod, który podałem, nastawiony jest na czytanie tylko liczb (próba odczytu litery jako liczby powoduje przejście strumienia w stan fail, co nie umożliwia dalszy odczyt z pliku). Wcześniej w komentarzu do pytania poprosiłem Cię o podanie (przykładowej) zawartości pliku, bo coś podejrzewałem, że w pliku nie będą same liczby. Nie zrobiłeś tego, a powinieneś.

Jak już musi być ta litera na końcu, to tak zrób:

while ((ifs >> hours).ignore())

 

To byłby błąd ?

Nie, jeśli dasz na początku using namespace std;

komentarz 18 sierpnia 2019 przez Bulbi Początkujący (250 p.)

Dobra już wszystko rozumiem, wielkie dzięki za spędzony czas przy pomocy ! :D

10
10 Dodano Sun Aug 18 10:49:26 2019

15 Dodano Sun Aug 18 10:49:30 2019

To jest przykładowa zawartość pliku, dlatego ze w programie umieściłem jeszcze funkcje sprawdź godziny pracownika i chciałem dodać urozmaicenie w postaci wyświetlania daty dodanych godzin.Ale z tego co widzę to raczej nie można tego zamieścić w pliku tak aby program działałał. Jeszcze raz wielkie dzięki ! yessmiley

komentarz 18 sierpnia 2019 przez Bulbi Początkujący (250 p.)
edycja 18 sierpnia 2019 przez Bulbi
Obszedłem problem na około robiąc to w ten sposób, że gdy użytkownik dodaje pracownika tworzą się dwa pliki txt jeden o nazwie nazwa_p+=".txt" a drugi o nazwa_p+="_w.txt"

I w tym zwyklym dodaje to z "Dodano Sun Aug 18 10:49:26 2019" A drugi dodaje bez tego "Dodano Sun Aug 18 10:49:26 2019" i przy wyplacie czyta ten który jest bez liter i wszystko działa dzięki jeszcze raz ;) !

 

topic.close();
komentarz 18 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Słabe. Tak zrób:

    std::tm t = {};
    unsigned hours;
    
    while (ifs >> hours >> std::get_time(&t, "%a %b %d %H:%M:%S %Y")) {
        std::cout << hours << '\n'
            << "year:" << 1900 + t.tm_year << '\n'
            << "day: " << t.tm_mday << '\n'
            << "month: " << t.tm_mon << "\n\n";
    }

Przykładowy odczyt linii w formacie "10 Sun Aug 18 10:49:26 2019" (dziwny format). Wywaliłem słowo Dodano, bo jest ono kompletnie zbędne.

 

Jak nie chcesz odczytywać daty, to wystarczy tak:

while ((iss >> hours).ignore(std::numeric_limits<std::streamsize>::max(), '\n')) {
        ...
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,026 wizyt
pytanie zadane 26 marca 2021 w Nasze poradniki przez Dawidziu Bywalec (2,610 p.)
+1 głos
1 odpowiedź 670 wizyt
pytanie zadane 27 września 2020 w Mikrokontrolery przez krzysieq18 Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 210 wizyt
pytanie zadane 22 maja 2018 w C i C++ przez kamila131 Nowicjusz (140 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...