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

Wczytywanie z pliku

Object Storage Arubacloud
0 głosów
129 wizyt
pytanie zadane 6 lutego 2020 w C i C++ przez kaminie318 Bywalec (2,070 p.)

Witam.Mam problem z zadaniem.

Polska 56.321
Hiszpania 67.40
Wyspy Owcze 14.532
...
Japonia 101.213

Chodzi o wczytywanie następujących linijek z pliku, a następnie wypisanie państwa o największej liczbie mieszkańców na ekran.

komentarz 6 lutego 2020 przez niezalogowany
edycja 6 lutego 2020

//prawie gotowiec


#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream obj_fsteram("dane.txt");
    string string_temp, str;
    double double_temp;
    while(!obj_fsteram.eof()) {
        while (!(obj_fsteram>>double_temp)) {
            obj_fsteram.clear();
            obj_fsteram>>str;
            string_temp+=' '+str;
              str="";
        }
        cout<<double_temp<<string_temp<<endl;
        string_temp="";
        //if()
    }
// cout<<double_max<<string_max;
    obj_fsteram.close();

    return 0;
}

 

ale polecam linki poniżej i opus magnum

https://www.youtube.com/watch?v=h2Taf16gQDI

https://www.youtube.com/watch?v=hk5NYscSPHI&list=PL5jc9xFGsL8G3y3ywuFSvOuNm3GjBwdkb&index=17

edit::edytowałem aby nie udziwniać

1 odpowiedź

0 głosów
odpowiedź 6 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)
Hej masz już jakiś kod napisany? Wczytywałeś już pliki tekstowe?

Mógłbym ci dać gotowca ,ale się nic nie nauczysz z tego.

Możesz utworzyć sobie dwie zmienne jedna dla nazwy państwa a druga dla wartości.

Dodatkowo tworzysz dwie zmienne na nazwę państwa i liczbę mieszkańców (chodzi o te które ma najwięcej osób)

Następnie wczytujesz plik linia po linii aż napotkasz koniec pliku.

Za każdym razem wczytujesz dwie dane nazwa państwa i liczbę mieszkańców.

Możesz założyć na początek ,że pierwsze dane z pliku to państwo o największej liczbie mieszkańców.

Następnie za każdym wczytaniem kolejnych danych porównujesz czy liczba mieszkańców jest większa.

Jeżeli tak to zmieniasz zmienne.

Na koniec wypisujesz te zmienne.

Pokaż co już napisałeś to ci pomogę to poprawić :)
komentarz 6 lutego 2020 przez kaminie318 Bywalec (2,070 p.)

Mam to zamknąć w funkcji. Mam cos takiego ale wyskakuje mi błąd, ale to chyba i tak nie zadziała bo w liczbie mieszkancow jest kropka.

void odczytajZPliku(fstream  plik)
{
	string Panstwo;
	int lbMieszkancow;
	while (!plik.eof())
	{
		plik << Panstwo << lbMieszkancow;
	}
}

 

komentarz 6 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)

Musisz dać typ zmiennoprzecinkowy zamiast int może to być float :)

plik >> Panstwo >> lbMieszkancow; 

wczytujesz z pliku do zmiennych to tak samo jak cin >> zmienna.

void odczytajZPliku(fstream  plik)
{
    string Panstwo;
    float lbMieszkancow;
    while (!plik.eof())
    {
        plik >> Panstwo >> lbMieszkancow;
    }
}

A ta funkcja ma tylko pobierać dane z pliku czy może też zająć się wyświetleniem państwa z największą liczbą mieszkańców? 

komentarz 6 lutego 2020 przez kaminie318 Bywalec (2,070 p.)
Musi zająć się tym i tym. Raczej jest coś źle ponieważ podkreśla mi argument funkcji :/
komentarz 6 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)
Jaki błąd się pokazuję? Pokaż cały kod
komentarz 6 lutego 2020 przez kaminie318 Bywalec (2,070 p.)

Ta funkcja to jest mój cały kod. Jest to moje ostatnie zadanie z egzaminu i chciałbym już potrafić je zrobić gdybym dostał takie coś w następnym terminie smiley

komentarz 6 lutego 2020 przez tkz Nałogowiec (42,000 p.)
plik >> Panstwo >> lbMieszkancow;

Nie zadziała dla dwu członowych nazw państw. 

komentarz 6 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)

Poprawiłem kod wczytuję państwa które w nazwie mają więcej niż jeden człon.

#include <iostream>
#include <fstream>
#include <string>

void odczytajZPliku(std::fstream  &plik)
{
    std::string Panstwo;
    std::string PanstwoMax = "";
    std::string temp;
    float lbMieszkancow;
    float lbMieszkancowMax = 0;
    while (!plik.eof())
    {
        while (!(plik >> lbMieszkancow))
        {
            plik.clear();
            plik >> temp;
            Panstwo += temp + " ";
            temp = "";
        }
        if (lbMieszkancow > lbMieszkancowMax)
        {
            PanstwoMax = Panstwo;
            lbMieszkancowMax = lbMieszkancow;
        }
        Panstwo = "";
    }
    std::cout << "Najwiecej mieszkancow:\n" << PanstwoMax << lbMieszkancowMax << std::endl;
}

int main()
{
    std::fstream plik;
    plik.open("dane.txt", std::fstream::in);
    odczytajZPliku(plik);
    return 0;
}

Napisz czy wszystko rozumiesz z kodu jeżeli nie to powiedz co to ci wytłumaczę ;)

komentarz 6 lutego 2020 przez kaminie318 Bywalec (2,070 p.)
while (!(plik >> lbMieszkancow))
        {
            plik.clear();
            plik >> temp;
            Panstwo += temp + " ";
            temp = "";
        }
        if (lbMieszkancow > lbMieszkancowMax)
        {
            PanstwoMax = Panstwo;
            lbMieszkancowMax = lbMieszkancow;
        }
        Panstwo = "";

Ten fragment trochę nie jasny, reszta w porządku.

komentarz 7 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)
W pętli próbuje wczytać liczbę mieszkańców jeżeli nie uda się to czyści błędy po czym wczytuje to jako tekst (nazwę państwa) aż nie uda się wczytać liczby. Jest to dlatego że mogą być nazwy składające się z kilku członów wtedy sklejamy nazwę :)
komentarz 7 lutego 2020 przez kaminie318 Bywalec (2,070 p.)
edycja 7 lutego 2020 przez kaminie318

Nie mogę rozgryźć od plik>> temp. Co ma na celu zrobić "  " i "" w temp i państwo?

Dla jednoczłonowych wystarczyłoby to ?

void odczytajZPliku(std::fstream  &plik)
{
    std::string Panstwo;
    std::string PanstwoMax;
    float lbMieszkancow;
    float lbMieszkancowMax=0;
    while (!plik.eof())
    {
       plik>>Panstwo>>lbMieszkancow;
        if (lbMieszkancow > lbMieszkancowMax)
        {
            PanstwoMax = Panstwo;
            lbMieszkancowMax = lbMieszkancow;
        }
    }
    std::cout << "Najwiecej mieszkancow:\n" << PanstwoMax << lbMieszkancowMax << std::endl;
}

 

komentarz 7 lutego 2020 przez XxPPDKxX Obywatel (1,400 p.)
Jeżeli byś miał tylko jednczlonowe to owszem wystarczyło by tylko odczytać tekst a zaraz potem liczbę.

A ten zabieg z dopisaniem " " chodzi o to żeby rozdzialic człony bo inaczej byś miał WyspyOwcze bez spacji.

A samo temp = "" jest po to żeby przy następnym odczycie mieć pewność że nic nie zostanie po ostatnim.

Podobne pytania

0 głosów
1 odpowiedź 108 wizyt
0 głosów
1 odpowiedź 352 wizyt
+1 głos
3 odpowiedzi 1,472 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 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!

...