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

Zadanie 9 rozdział 6 Szkola programowania język C++

Object Storage Arubacloud
0 głosów
271 wizyt
pytanie zadane 2 lutego 2021 w C i C++ przez Karson Obywatel (1,000 p.)

Zadanie 9:

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

Sam Stone 
10000 
Freida Flass 
10050 
Tammy Tubbs 
5000 
Rich Raptor 
55000
 

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

 

Nie wiem od czego zacząć to zadanie. Widziałem ze był na forum wstawiony kod ale nie rozumiem niektórych rzeczy w nim i nie wiem czemu nawet jak go napisałem to nie działał. 

Proszę o pomoc w tym zadaniu cool

komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Nie wiem od czego zacząć to zadanie.

Od strumienia std::ifstream.

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
To nie wiem jak je zrobić
1
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Ale czego Ty oczekujesz? Że ktoś Ci to wszystko napisze?

Tu masz przykład czytania z pliku do tablicy:

struct donator {
    std::string name;
    double amount;
};

...

std::ifstream ifs("nazwa-pliku");
int n;
    
ifs >> n;
    
donator* tab = new donator[n];
    
for (int i = 0; i < n && 
                std::getline(ifs >> std::ws, tab[i].name) &&
                ifs >> tab[i].amount; 
    ++i) {}

Z pozostałą częścią zadania kombinuj sobie sam...

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Nie wiem ale za każdym razem co bym nie napisał to nie wczytuje mi żadnych danych, chyba ze jest coś zle z moim plikiem.
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)
Możliwe. Prawdopodobnie strumień nie otwiera pliku (ścieżka zła?), bo kod na bank jest poprawny.
komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Ostatnio jak korzystałem z tego pliku wszystko było ok. Próbowałem nawet skopiować i wkleić kod który powinien działać bo kilka razy pisałem i nic, ale nawet ten wklejony nie działa wiec może zrobie jakiś nowy plik i sprobuje na nim? a co do ścieżki to podaje całą.
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Zrób prosty test:

std::ifstream ifs("nazwa-pliku");
if(!ifs.is_open()) std::cout << "Dupa :(\n";

...

będziesz wiedział, czy plik się otwiera.

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)

Mam to wprowadzone, mam tez ze jeżeli EOF to wyświetla koniec pliku i właśnie za każdym razem wyświetla koniec pliku.  :x wkleję kod, nawet nie jestem w stanie sprawdzić czy jest dobry.

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
struct wplacajacy
{
    string nazwisko;
    double kwota;
};
int main()
{
    string nazwa_pliku;
    ifstream plik;
    cout << "Podaj nazwe pliku z danymi: ";
    getline(cin, nazwa_pliku);
    plik.open(nazwa_pliku);
    if (!plik.is_open())
    {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        exit(EXIT_FAILURE);
    }
    int n;
    plik >> n;
    wplacajacy * dane = new wplacajacy[n];
    
    while (plik.good())
    {
        for (int i = 0; i < n && getline(plik >> ws, dane[i].nazwisko) && plik >> dane[i].kwota; ++i)
        {
            cout << dane[i].nazwisko << endl;
            cout << dane[i].kwota << endl;
        }
    }
    if (plik.eof())
        cout << "Koniec pliku.\n";
    else if (plik.fail())
        cout << "Wczytywanie danych przerwane - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    plik.close();
    
        
    return 0;
}

 

komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

A po cholerę ta pętla while z linii 26? Przecież for, który podałem, robi całą robotę.

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
to nic nie zmienia bo bez while tez nie działa
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Jaką wartość ma n?

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Jeżeli n wczytuje pierwsza wartość z pliku to 4.
komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Mam kod który mi działa ale jest problem taki ze mam stworzone trzy projekty w Xcode w których pisze i kod który działa, działa mi tylko w jednym projekcie a juz w innych nie.. nawet nie musze wpisywać całej ścieżki, wystarczy tylko nazwa i odczytuje ale nie wiem czemu nie odczytuje w pozostałych.
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Jeżeli n wczytuje pierwsza wartość z pliku to 4.

Nie pisz mi, co by było gdyby, bo to wiem (w końcu napisałem ten kod). Interesuje mnie, co ten program czyta z pliku u Ciebie (bo skoro twierdzisz, że strumień się otwiera, to albo coś przeczyta, albo wejdzie w stan błędu). 

Jeszcze jedna rzecz mi przyszła do głowy. Być może ten plik z danymi zapisałeś w utf-8 z BOM-em, który może powodować, że strumień przy odczycie wartości n wchodzi w stan błędu. Sprawdź to.

 

komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Nic nie czyta bo wchodzi w stan Bledu. A co do pliku to ten sam plik mogę otworzyć w innym projekcie(zapisie) ale tylko w jednym, w innych juz nie działa.
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)
Sprawdziłeś ten BOM, czy nie?
komentarz 2 lutego 2021 przez Karson Obywatel (1,000 p.)
Nie, nie wiem jak
komentarz 2 lutego 2021 przez j23 Mędrzec (194,920 p.)

Podejrzyj plik w jakimś hexedytorze, ewentualnie - choć nie wiem, czy to zadziała na macOS-ie - wpisz w terminalu xxd -g1 nazwa-pliku i sprawdź, czy zaczyna się od właściwego tekstu, czy może są tam jakieś dziwne wartości na początku (patrz link, który podałem).

komentarz 3 lutego 2021 przez Karson Obywatel (1,000 p.)
wpisałem w konsoli i w jednym pliku którego nie moglem odczytać nigdzie pisze: 00000000: 4b 61 72 6f 6c itd., a wpisze nazwę innego to pisze ze ma takiego pliku albo katalogu.
komentarz 3 lutego 2021 przez j23 Mędrzec (194,920 p.)
Sprawdzałeś prawa dostępu?

Stwórz plik z danymi testowymi i pokaż jego całą zawartość hex.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

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

...