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

question-closed Problem z odczytem wierszy z pliku .txt do tablicy dynamicznej (Biblioteka fstream)

Object Storage Arubacloud
0 głosów
355 wizyt
pytanie zadane 15 maja 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)
zamknięte 15 maja 2017 przez Kamil Paradowski

Witam, mam dosyć irytujący problem z którym walczę już od dobrych kilku godzin. Próbuje zrobić zadanie nr. 9 z rodziału nr. 6 z książki "Język C++ Szkoła Programowania Wydanie VI" autorstwa Stephen'a Prata. Treść zadania brzmi następująco:

""Ponownie wykonaj ćwiczenie 6 ale tym razem informacje mają być odczytywane z pliku. Pierwszy zapis w pliku to liczba donatorów dalej wiersze są ułożone parami: pierwszy wiersz pary zawiera nazwisko daroczyńcy, drugi zawiera wysokość wpłaty" 

Sam Stone 
2000 
Freida Flass 
100500 
Tammy Tubbs 
5000 
Rich Raptor 
55000

Treść ćwiczenia nr. 6 brzmi tak:

""Przygotuj program sledzacy wplywy na konto Towarzystwa na Rzecz Zachowania Dobrych Wplywow. Uzytkownik ma byc pytany o liczbe wplacajacych, a nastepnie ma prosic o podanie wplaty kazdego donatora. Informacje nalezy umiescic w dynamicznie alokowanej tablicy struktur. Kazda struktura ma miec dwa pola: tablice znakowa (lub obiekt klasy string) na nazwisko oraz pole typu double na kwote. Po odczytaniu wszystkich danych program ma pokazac nazwiska i wplaty wszystkich, ktorzy dali przynajmniej 10000. Lista ta ma miec naglowek Nasi Wspaniali Sponsorzy. Dalej program ma pokazac liste pozostalych ofiarodawcow, tym razem z naglowkiem Nasi Sponsorzy". Jeśli w którejśc z kategorii zabraknie nazwisk, program ma wyświetlić słowo brak. Sponsorzy mają być podzieleni na dwie opisane grupy, ale w ramach tych grup nie należy już ich nijak sportować.

Napisałem taki kod:

#include <iostream>
#include <fstream>

int main()
{
    struct c
    {
        std::string a;
        double b;
    };
    std::fstream d;
    short a;
    d.open("Sponsorzy.txt", std::ios::in);
    if(!d.is_open())
        std::cout<<"Plik nie istnieje!"<<std::endl;
    else
    {
        d>>a;
        std::cout<<"Liczba donacji wynosi: "<<a<<std::endl;
        int i=0;
        c*b=new c[a];
        for(i=0; i<a; i++)
        {
            getline(d,b[i].a);
        }
        d.seekg(12,std::ios::beg);
        for(i=0; i<a; i++)
        {
            d>>b[i].b;
            getline(d,b[i].a);
            getline(d,b[i].a);
        }
        std::cout<<"\nNasi Wspaniali Sponsorzy"<<std::endl<<std::endl;
        for(i=0; i<a; i++)
        {
            if (b[i].b>=10000)
            {
                if(b[i].a.empty())
                    std::cout<<"brak"<<std::endl;
                else
                    std::cout<<b[i].a<<std::endl;
            std::cout<<"Przelana kasa: "<<b[i].b<<std::endl<<std::endl;
            }
        }
        std::cout<<"Nasi Sponsorzy"<<std::endl<<std::endl;
        for(i=0; i<a; i++)
        {
            if (b[i].b<10000)
            {
                if(b[i].a.empty())
                    std::cout<<"brak"<<std::endl;
                else
                    std::cout<<b[i].a<<std::endl;
            std::cout<<"Przelana kasa: "<<b[i].b<<std::endl<<std::endl;
            }
        }
        std::cout<<b[0].a<<std::endl;
        std::cout<<b[1].a<<std::endl;
        std::cout<<b[2].a<<std::endl;
        std::cout<<b[3].a<<std::endl;
        delete [] b;
    }
    if(!d.is_open())
        std::cout<<"Koniec programu!";
    d.close();
    return 0;
}

Jednakże mam problem z wczytaniem wierszy z nazwiskami w taki sposób jaki powinien być. Pomimo, że wydaje mi się, że kursor pliku .txt jest na odpowiednim miejscu to zamiast wczytywać w pętli nazwisko od "Sam Stone", wczytuje mi od "Freida Flass" z różnymi efektami. Próbowałem już wielu rzeczy, manipulowanie kursorem, sprawdzanie znaków, ale dla mnie wyniki które uzyskuje są kompletnie nielogiczne. Chcę zapisać te nazwiska do dynamicznej tablicy string, podobnie też muszę zrobić z liczbami, jednak (jakimś szczęściem) udało mi się to zapisać w prawidłowy sposób. Bardzo proszę o pomoc, tracę już cierpliwość do tego zadania :) Najlepiej gdybym tylko musiał zmienić w kodzie wiersze od 22 do 25, ponieważ myślę, że sam w sobie kod jest ok. 

komentarz zamknięcia: Udało mi się dojść do rozwiązania problemu.

1 odpowiedź

+1 głos
odpowiedź 15 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Pro tip na początek - nazwy zmiennych dobieraj tak, aby odnosiły się do swojego przeznaczenia. Literki a, b, c, d w niczym nie pomagają czytającemu kod, a wręcz nawet utrudniają.
komentarz 15 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Tak, to prawda, zrobiłem taki nawyk i wiem, że muszę się do oduczyć.
komentarz 15 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Na szybko: brakuje w kodzie #include <string>
komentarz 15 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Mój kompilator ma wbudowaną bibliotekę string w bibliotece <iostream>
komentarz 15 maja 2017 przez redie Obywatel (1,490 p.)
Mając visual studio z najnowszymi standardami, musiałem dodać #include <string> bo nie widziało mi getline na przykład :) i nie mogłem wypisać rzeczy :)
komentarz 15 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Pracuje obecnie na Code::Blocks i tam jest tak zrobione, że biblioteka string jest wbudowana w iostream :P Jestem świadomy, że powinno się dodawać bibliotekę string, w każdym bądź razie to nie jest raczej przyczyną mojego problemu. Masz może jakiś pomysł na mój problem, Tobie też 2x wyświetla się na dole te same nazwisko w komórce nr. 0 i nr. 3 w tablicy dynamicznej?
komentarz 15 maja 2017 przez redie Obywatel (1,490 p.)
A powiedz mi, po co  ci kolejne wypisywanie (linijki 57-61) ??
komentarz 15 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Dodałem to tylko w ramach testów programu, żebym widział jakie dane faktycznie są zapisywane do komórek w tablicy. Kiedy będę miał pewność, że już wszystko działa poprawnie usunę to.
komentarz 15 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
OK, chyba udało mi się rozwiązać ten problem!

Podobne pytania

0 głosów
0 odpowiedzi 141 wizyt
0 głosów
1 odpowiedź 549 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez Hubert731 Obywatel (1,650 p.)
0 głosów
0 odpowiedzi 100 wizyt

92,580 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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!

...