Głównym problemem był średnik po while(...). Program nie wykonywał poprawnej pętli.
Innym problemem było czytanie znaku odpowiedzi. Chwali Ci się że próbowałeś <algorithm>, ale w tym kontekście był zbędny.
Wszelkie liczniki deklaruj jako std::size_t. Czy licznik może mieć wartość ujemną (a tak jest dla int)?
Obiekt pliku w trakcie otwierania, przyjmuje nazwę pliku. Zbędne jest otwieranie przez .open(...). Także w trakcie niszczenia, będzie ten plik zamykał. Zbędne wtedy będzie .close(). Ja je zostawiłem bo ilość wcięć kodu była by zbyt duża.
Nadużywasz std::endl. To jest "ciężkie". Wykonuje wyprowadzenie '\n' na ekran i opróżnienie (std::flush) bufora. Tu tenże std::flush jest zbędny.
Stałe w programie (ilość pytań), deklaruj jawnie by unikać magicznego 5 (u Ciebie).
Wyprowadzanie na strumień std::cout można połączyć.
Jeśli program ma zakończyć się źle, zwróć EXIT_FAILURE z <cstdlib> i w konsekwencji jeśli jest ok zwracasz EXIT_SUCCES.
Jeśli otworzysz strumień std::ifstream (i - od input), nie będzie konieczne klepanie informacji o wejściu/wyjściu.
Nie testuj strumienia pliku przez .good(). Wystarczy sam strumień.
Preferuj pre-(inkrementację/dekrementację) jeśli jest to obojętne dla logiki programu.
Jeszcze wiele można poprawić, ale małymi krokami :-) (zmienne globalne, static, funkcje.. )
Małe poprawki:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstddef>
#include <string>
using namespace std;
const static size_t ILOSC_PYTAN = 5;
string temat;
string nick;
string tresc[ILOSC_PYTAN];
string odpA[ILOSC_PYTAN];
string odpB[ILOSC_PYTAN];
string odpC[ILOSC_PYTAN];
string odpD[ILOSC_PYTAN];
char poprawna_odp[ILOSC_PYTAN];
char odp;
size_t punkty = 0;
int main()
{
size_t nr_linii = 1;
string linia;
size_t nr_pytania = 0;
ifstream plik("quiz.txt");
if (!plik)
{
cout << "Nie udalo sie odczytac pliku!";
exit(EXIT_FAILURE);
}
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_odp[nr_pytania] = linia[0]; break;
}
if (nr_linii == 8)
{
nr_linii = 2;
++nr_pytania;
}
++nr_linii;
}
plik.close();
for (size_t i = 0; i < ILOSC_PYTAN; ++i)
{
cout << '\n' << tresc[i] << '\n'
<< "A. " << odpA[i] << '\n'
<< "B. " << odpB[i] << '\n'
<< "C. " << odpC[i] << '\n'
<< "D. " << odpD[i] << '\n';
cout << "Twoja odpowiedz:";
cin >> odp;
odp = ::tolower(odp);
if (odp == poprawna_odp[i])
{
cout << "Gratulacje! Dobra odpowiedz!\n";
++punkty;
} else {
cout << "Bledna odpowiedz. Poprawna odpowiedz to: "
<< poprawna_odp[i] << '\n';
}
}
cout << "\nKoniec gry! Twoje punkty:"
<< punkty << '\n';
return EXIT_SUCCESS;
}