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"
4
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.