W tym odcinku pojawiły się pierwsze schody :) Widziałem w komentarzach na YT, że kilka osób też miało z tym problem, więc opisze jak doszedłem do oświecenia.
Po pierwsze powtórzenie sobie tego pozwoli mi na jeszcze lepsze zrozumienie, a po drugie, może się komuś przyda :)
Zastanawiałem się, jak to możliwe, że po powróceniu z linii 8 do linii 3 z pliku pobierane są kolejne linie (9,10,11 itd.).
Otóż: Za pobieranie kolejnych linii odpowiada funkcja 'getline()', która ma dwa argumenty (oddzielone przecinkiem). Pierwszy mów skąd program bierze te linie, a drugi gdzie ma je zapisać (w jakiej zmiennej - my nazwaliśmy ją "linia").
I ta funkcja ubrana w 'While' będzie zwracać linie, aż do wyczerpania wszystkich linii w pliku txt.
Zmienną nr_linii utworzyliśmy sobie roboczo na potrzeby 'switcha'.
Pobieranie linii od 3-8 jest logiczne, ale później następują czary :)
Otóż, zmienna nr_linii nie wpływa na funkcję getline(). Ona cały czas pobiera kolejne linie pliku txt. po pobraniu 8 linii z pliku txt My mówimy programowi: zmień zmienną nr_linii na 3.
I teraz: funkcja getline() pobierze kolejny wiersz z txt (nr9), ale 'switch' "będzie myślał", że to linia 3. i tam zapisze linię 9. później 10-tą linię jako 4 itd.
Zmieniając nr_linii z 8 na 3, dokonaliśmy także inkrementacji zmiennej nr_pytania, która odpowiada za to, na którym miejscu w tablicy zapisać kolejne linie.
Żeby to ogarnąć musiałem wrócić do początku odcinka, bo trochę chyba przespałem ważną informację o działaniu funkcji getline, oraz dokładnie to wszystko przemyśleć :)
I na koniec jeszcze kod tego o co się rozchodzi:
int main()
{
int nr_linii=1;
string linia;
int nr_pytania=0;
fstream plik;
plik.open("quiz.txt",ios::in);
//(...)
while(getline(plik,linia))
{
switch(nr_linii)
{
case 1: temat=linia; break;
case 2: nick=linia; break;
case 3: tresc[nr_pytania]=linia; break;
case 4: odpA[nr_pytania]=linia; break;
case 5: odpB[nr_pytania]=linia; break;
case 6: odpC[nr_pytania]=linia; break;
case 7: odpD[nr_pytania]=linia; break;
case 8: poprawna[nr_pytania]=linia; break;
}
if(nr_linii==8)
{
nr_linii=2; nr_pytania++;
}
nr_linii++;
}
plik.close();
for (int i=0; i<=4; i++)
{
//(...)