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

Język C++ szkoła programowania - rozdział 6 zadanie 9, wprowadzanie danych z pliku do tablicy struktur.

0 głosów
87 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez Junior_plusplus Obywatel (1,050 p.)

Treść Zadania 9 z rozdziału 6:

"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 darczyńcy, drugi zawiera wysokość wpłaty"
4
Sam Stone
10000
Freida Flass
10050
Tammy Tubbs
5000
Rich Raptor
55000


Treść zadania 6 : 
"Przygotuj program śledzący wpływy na konto Towarzystwa na Rzecz Zachowania Dobrych Wpływów. Użytkownik ma być pytany o liczbę wpłacających, a następnie ma prosić o podanie wpłaty każdego donatora. Informacje należy umieścić w dynamicznie alokowanej tablicy struktur. Każda struktura ma mieć dwa pola: tablice znakowa (lub obiekt klasy string) na nazwisko oraz pole typu double na kwotę. Po odczytaniu wszystkich danych program ma pokazać nazwiska i wpłaty wszystkich, którzy dali przynajmniej 10000. Lista ta ma mieć nagłówek Nasi Wspaniali Sponsorzy. Dalej program ma pokazać listę pozostałych ofiarodawców, tym razem z nagłówkiem Nasi Sponsorzy".

Witam, mam problem, który polega na tym, że podczas uruchomienia programu wyświetlana jest tylko pierwsza z wczytanych z pliku osób wraz z wysokością datku. Dodam, że instrukcje sprawdzające wskazują na błąd z odczytem danych który zostaje przerwany.

W związku z powyższym bardzo proszę o:

- pomoc/wskazówkę  w rozwiązaniu problemu,

- ogólną ocenę kodu/wskazówki co mógłbym ulepszyć.

Z góry dziękuję za pomoc.

Poniżej kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <sstream>

using namespace std;

struct ofiarodawcy
{
    string nazwisko;
    double wysokosc_datku;
};

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;

    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);

    if (!odczyt.is_open())
     {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    string ilosc_darczyncow_konwersja;
    getline(odczyt,ilosc_darczyncow_konwersja);

    int ilosc_darczyncow;
    istringstream is(ilosc_darczyncow_konwersja);
    is>>ilosc_darczyncow;

    ofiarodawcy * baza_darczyncow = new ofiarodawcy[ilosc_darczyncow];

    for (int i = 0; i < ilosc_darczyncow; i++)
    {
        getline(odczyt, baza_darczyncow[i].nazwisko);
        odczyt>>baza_darczyncow[i].wysokosc_datku;
    }
     if (odczyt.eof())
        cout << "\n\nKoniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwane - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (ilosc_darczyncow == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        int ilosc_osob = 0;

        cout << "Nasi Wspaniali Sponsorzy: \n";
        for (int i = 0; i < ilosc_darczyncow; i++)
        {
             if(baza_darczyncow[i].wysokosc_datku >= 10000)
             {
                cout << baza_darczyncow[i].nazwisko << ": ";
                cout << baza_darczyncow[i].wysokosc_datku<<endl;
                ilosc_osob++;
             }
         }

        if(ilosc_osob == 0)
            cout << "Brak\n\n";

        cout << "Nasi Sponsorzy: \n";
        ilosc_osob = 0;

        for (int i = 0; i < ilosc_darczyncow; i++)
        {
             if(baza_darczyncow[i].wysokosc_datku < 10000 && baza_darczyncow[i].wysokosc_datku !=0)
             {
                cout << baza_darczyncow[i].nazwisko << ": ";
                cout << baza_darczyncow[i].wysokosc_datku<<endl;
                ilosc_osob++;
             }
        }
        if(ilosc_osob == 0)
            cout << "Brak\n\n";

    }
    delete [] baza_darczyncow;
    odczyt.close();
    cout << endl;

    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 24 maja 2018 przez Hipcio Szeryf (91,240 p.)
wybrane 24 maja 2018 przez Junior_plusplus
 
Najlepsza

Zwykłe wczytywanie (>>) zostawia w buforze znak nowej linii - trzeba go odrzucić jeżeli korzysta się później z getline:

	int ilosc_darczyncow;
	odczyt >> ilosc_darczyncow;
	odczyt.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // dołącz w nagłówkach <limits>

	ofiarodawcy * baza_darczyncow = new ofiarodawcy[ilosc_darczyncow];

	for (int i = 0; i < ilosc_darczyncow; i++)
	{
		getline(odczyt, baza_darczyncow[i].nazwisko);
		odczyt >> baza_darczyncow[i].wysokosc_datku;
		odczyt.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	}

lub tak:

	int ilosc_darczyncow;
	odczyt >> ilosc_darczyncow >> std::ws; // ws - white skip

	ofiarodawcy * baza_darczyncow = new ofiarodawcy[ilosc_darczyncow];

	for (int i = 0; i < ilosc_darczyncow; i++)
	{
		getline(odczyt, baza_darczyncow[i].nazwisko);
		odczyt >> baza_darczyncow[i].wysokosc_datku >> std::ws;
	}
komentarz 24 maja 2018 przez Junior_plusplus Obywatel (1,050 p.)

I gitara !!!

Wszystko pięknie działa po zastosowaniu ">>ws;".

Bardzo, bardzo dziękuję za pomoc i pozdrawiam !

Oto aktualny kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <sstream>

using namespace std;

struct ofiarodawcy
{
    string nazwisko;
    double wysokosc_datku;
};

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;

    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);

    if (!odczyt.is_open())
     {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    string ilosc_darczyncow_konwersja;
    getline(odczyt,ilosc_darczyncow_konwersja);

    int ilosc_darczyncow;
    istringstream is(ilosc_darczyncow_konwersja);
    is>>ilosc_darczyncow>>ws;

    ofiarodawcy * baza_darczyncow = new ofiarodawcy[ilosc_darczyncow];

    for (int i = 0; i < ilosc_darczyncow; i++)
    {
        getline(odczyt, baza_darczyncow[i].nazwisko);
        odczyt>>baza_darczyncow[i].wysokosc_datku>>ws;
    }
     if (odczyt.eof())
        cout << "\n\nKoniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwane - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (ilosc_darczyncow == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        int ilosc_osob = 0;

        cout << "\nNasi Wspaniali Sponsorzy: \n";
        for (int i = 0; i < ilosc_darczyncow; i++)
        {
             if(baza_darczyncow[i].wysokosc_datku >= 10000)
             {
                cout << baza_darczyncow[i].nazwisko << ": ";
                cout << baza_darczyncow[i].wysokosc_datku<<endl;
                ilosc_osob++;
             }
         }

        if(ilosc_osob == 0)
            cout << "Brak\n\n";

        cout << "\nNasi Sponsorzy: \n";
        ilosc_osob = 0;

        for (int i = 0; i < ilosc_darczyncow; i++)
        {
             if(baza_darczyncow[i].wysokosc_datku < 10000 && baza_darczyncow[i].wysokosc_datku !=0)
             {
                cout << baza_darczyncow[i].nazwisko << ": ";
                cout << baza_darczyncow[i].wysokosc_datku<<endl;
                ilosc_osob++;
             }
        }
        if(ilosc_osob == 0)
            cout << "Brak\n\n";

    }
    odczyt.close();
    delete [] baza_darczyncow;

    cout << endl;

    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 151 wizyt
pytanie zadane 2 września 2018 w C i C++ przez vog Początkujący (260 p.)
0 głosów
2 odpowiedzi 124 wizyt
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

62,471 zapytań

108,625 odpowiedzi

226,798 komentarzy

36,396 pasjonatów

Przeglądających: 171
Pasjonatów: 9 Gości: 162

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...