• 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

Object Storage Arubacloud
0 głosów
469 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 13 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Po co to stoi, skoro może od razu czytać liczby ze strumienia przy pomocy operatora >>?

komentarz 13 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
Jeżeli używa getline (jak w przykładowym kodzie) to musi najpierw sparsować otrzymany napis. Dzięki temu będzie mógł rozwinąć kod który już ma.
komentarz 13 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Podejrzewam, że używa getline, bo gdzieś podpatrzył jak czytać linie tekstu (poszczególne wartości leżą w oddzielnych liniach, więc szukał sposobu na czytanie linii).  Tutaj na 99% (prostszym) rozwiązaniem jest operator >>. Żadne dodatkowe konwersje nie będą potrzebne.

komentarz 16 sierpnia 2019 przez Bulbi Początkujący (250 p.)
    if (wybor == 4)
    {
        string stawka_h;
        cout << "Wyplate ktorego pracownika chcesz zobaczyc ? : "<< endl;
        cin >> nazwa_p;
        nazwa_p+=".txt";

        string przepracowane; // Wiem ze to trzeba przekonwertowac na int
        string linia;
        fstream plik;
        plik.open(nazwa_p, ios::in);
        if(plik.good() == true)
        {
        getline (plik,linia);

        while(!plik.eof())
        {
            getline(plik, linia);
            cout << linia << endl; // Sprawdzam czy dziala
            przepracowane += linia;
        }
        cout << przepracowane; // Tutaj tylko sprawdzam czy to dziala

        plik.close(

Utknąłem tu nie mam pojęcia dlaczego zawartość txt wyświetla się od 2 linii, a nie od pierwszej jeśli komuś się chce to może dokończyć kod z chęcią go przeanalizuję.

Chcialem to wykonac w ten sposob zeby zawartosc txt wyswietlala sie wlasnie od 2 linii, dodawalo wszystkie dopóki można a na końcu zmienił numer linii na 1 i Sume wszystkich liczb wymnożył przez pierwszą linie kodu txt ( stawke )

 

Jeśli komuś się przyda mogę podesłać cały kod

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

nie mam pojęcia dlaczego zawartość txt wyświetla się od 2 linii, a nie od pierwszej

Pierwszą linię tekstu czytasz w linii 14, ale jej nie wyświetlasz.

 

BTW, to chciałeś zrobić?:

std::ifstream ifs(nazwa_p);

unsigned hourlyWage, hours, sum = 0;

if (ifs >> hourlyWage) {
    while (ifs >> hours) {
        sum += hours;
    }

    std::cout << sum * hourlyWage << '\n';
}

 

 

komentarz 17 sierpnia 2019 przez Bulbi Początkujący (250 p.)
Tak Chciałem zrobić dokładnie to! Dzięki bardzo mógłbyś mi jeszcze wyjaśnić na czym polega std ? dlaczego użyles ifstream a nie fstream i czy "ifs" to zwykła zmienna ? Tylko 10 linii ale nie wszystko rozumiem i co jest w linii 3 ?
komentarz 17 sierpnia 2019 przez j23 Mędrzec (194,920 p.)
  1.  std to przestrzeń nazw biblioteki standardowej C++. 
  2.  użyłem std::ifstream ponieważ potrzebowałem tylko strumienia do odczytu z pliku. std::fstream jest strumieniem dwukierunkowym (w tym przypadku jest on zbędny).
  3.  tak, to zwykła zmienna.
  4. w linii 3 definiowane są trzy zmienne typu unsigned int. Jeśli stawka godzinowa jest liczbą z przecinkiem, hourlyWage powinna być typu float lub double.
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,070 wizyt
pytanie zadane 26 marca 2021 w Nasze poradniki przez Dawidziu Bywalec (2,610 p.)
+1 głos
1 odpowiedź 683 wizyt
pytanie zadane 27 września 2020 w Mikrokontrolery przez krzysieq18 Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 215 wizyt
pytanie zadane 22 maja 2018 w C i C++ przez kamila131 Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...