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

Pętla while(getline)

VPS Starter Arubacloud
0 głosów
2,575 wizyt
pytanie zadane 1 lipca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
void wczytaj()
{
    fstream plik;
    plik.open("quiz.txt", ios::in);
    
    if(plik.good()==false)
    {
        cout<<"NIE UDALO SIE OTWORZYC PLIKU!";
        exit(0);
    }
    
    int nr_linii=(nr_pytania-1)*6+1;
    int aktualny_nr=1;
    string linia;
    
    while(getline(plik, linia))
    {
        if(aktualny_nr==nr_linii) tresc=linia;
        if(aktualny_nr==nr_linii+1) a=linia;
        if(aktualny_nr==nr_linii+2) b=linia;
        if(aktualny_nr==nr_linii+3) c=linia;
        if(aktualny_nr==nr_linii+4) d=linia;
        if(aktualny_nr==nr_linii+5) poprawna=linia;
        
        aktualny_nr++;
    }
    
    plik.close();
    
    
}

Cześć wszystkim! Mam pytanie dotyczące powyższego kodu. Jestem aktualnie na 2 odcinku kursu obiektowego C++ u Pana Mirosława i chciałbym się Was zapytać czy dobrze rozumiem działanie zawartej pętli while:

w przypadku, gdy nr_pytania jest równy 1, to nr_linii też jest równy 1 i oznacza 1 linię w pliku .txt, w której rzeczywiście zaczyna się pierwsze pytanie, więc pętla while od razu wykonuje wczytywanie pierwszego pytania. Zastanawia mnie, czy w przypadku, gdy nr_pytania jest równy 2, czyli nr_linii jest równy 7, to pętla najpierw wykonuje się 6 razy ( a właściwie wykona się tylko linia aktualny_nr++; ), aby za siódmym rozpocząć wczytywanie drugiego pytania? 

3 odpowiedzi

+2 głosów
odpowiedź 1 lipca 2018 przez RafalS VIP (122,820 p.)
wybrane 1 lipca 2018 przez MAXIM7
 
Najlepsza

To bardzo dobry moment, żeby nauczyć się odpowiadać na takie pytania samemu. Jak? Dodaj do programu liczniki lub wypisywanie zeby zobaczyć co się dzieje. Np w ten sposób:

	while (getline(plik, linia))
	{
		cout << "obieg petli: aktualny_nr: " << aktualny_nr << endl;
		if (aktualny_nr == nr_linii) tresc = linia;
		if (aktualny_nr == nr_linii + 1) a = linia;
		if (aktualny_nr == nr_linii + 2) b = linia;
		if (aktualny_nr == nr_linii + 3) c = linia;
		if (aktualny_nr == nr_linii + 4) d = linia;
		if (aktualny_nr == nr_linii + 5) poprawna = linia;

		aktualny_nr++;
	}

Nawet doświadczeni programiści bardzo często korzystają z takich metod żeby zrozumieć działanie programu. Nie chce im sie pisać tych cout'ow, bo są od tego narzędzi tzw debugery pozwalające prześledzić przebieg programu z podglądaniem wartości zmiennych w danym momencie. Ale póki co Tobie wystarczą couty.

komentarz 1 lipca 2018 przez MAXIM7 Obywatel (1,990 p.)
hmm, a to ciekawe, bo jak dodałem tą linię to wiedzę, że pętla najpierw inkrementuje się 30 razy (czyli tyle ile jest wszystkich linii w pliku .txt) a następnie wyświetla dopiero pierwsze pytanie i tak jest z każdym kolejnym. :D dzięki za pomoc ;)
komentarz 1 lipca 2018 przez RafalS VIP (122,820 p.)
Bo w pętli nie ma żadnego wyświetlania, które pewnie jest gdzieś dalej przez co wczytujesz pierwsze pytanie, nadpisujesz drugim, które nadpisujesz kolejnym i efektywnie po wyjściu z pętli masz wczytane ostatnie pytanie.
komentarz 2 lipca 2018 przez Hiskiel Pasjonat (22,830 p.)

Jak ja kocham debugowanie coutami heart

1
komentarz 2 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
Taki sposób debugowania nawet ma swoją nazwę. Debugowanie na d*pę :/ Niezbyt to ładne ale chodzi o wyświetlenie tego komunikatu w ... kluczowym miejscu. Lepiej rzecz jasna taki komunikat później usunąć a jeszcze lepiej nie używać wulgaryzmów.

Jeśli jednak stricte technicznie podejść do problemu, lepiej wyprowadzić komunikaty na std::cerr lub std::clog .
+1 głos
odpowiedź 1 lipca 2018 przez Alan1221 Użytkownik (950 p.)
Tak właśnie to działa. Na początku kursor jest ustawiony na początku pliku (*.txt). Słyszałem tylko o funkcji fseek, która ten kursor przestawia na nową pozycję.
+1 głos
odpowiedź 1 lipca 2018 przez MsMaciek123 Pasjonat (24,760 p.)

Zastanawia mnie, czy w przypadku, gdy nr_pytania jest równy 2, czyli nr_linii jest równy 7, to pętla najpierw wykonuje się 6 razy ( a właściwie wykona się tylko linia aktualny_nr++; ), aby za siódmym rozpocząć wczytywanie drugiego pytania? 

Tak. Chyba po twojej analizie rozumiesz jak to dziala.

 

Podobne pytania

+1 głos
1 odpowiedź 1,034 wizyt
pytanie zadane 18 września 2016 w C i C++ przez KamilGG Użytkownik (690 p.)
0 głosów
2 odpowiedzi 534 wizyt
pytanie zadane 18 czerwca 2019 w C i C++ przez Eryk Słowiński Początkujący (280 p.)
0 głosów
1 odpowiedź 637 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...