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

question-closed Wczytywanie pliku do programu

Object Storage Arubacloud
0 głosów
321 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez Marcin Reguła Początkujący (450 p.)
zamknięte 5 kwietnia 2018 przez Marcin Reguła

Cześć! 
Mam taki mały problem z wczytywaniem pliku tekstowego do programu a z tego co sam wymyśliłem to chyba z samym wyświetlaniem. "Wczytują" się tylko 3 pytania, nie udało mi się wykminić dlaczego jednak wyświetlone zostaje tylko to co miało być wypisane przez cout a już zmienna nie jest wczytywana. Podrzucam cały folder oraz sam kod i plik. Proszę o jakąś podpowiedz o co może chodzić. Z góry dziękuję.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>

using namespace std;

string temat, nick;
string tresc[5];
string odpA[5], odpB[5], odpC[5],odpD[5];
string poprawna_odp[5];
string odp;
int punkty=0;

int main()
{
    int nr_linii=1;
    string linia;
    int nr_pytania=0;
    fstream plik;
    plik.open("quiz.txt", ios::in);

    if (plik.good()==false)
       {
        cout<<"Nie udalo sie odczytac pliku!";
        exit(0);
       }

    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;  break;
        }

         if (nr_linii==8) {nr_linii=2; nr_pytania++;}
         nr_linii++;
    }
    plik.close();

    for (int i=0; i<4; i++)
    {
         cout<<endl<<tresc[i]<<endl;
         cout<<"A. "<<odpA[i]<<endl;
         cout<<"B. "<<odpB[i]<<endl;
         cout<<"C. "<<odpC[i]<<endl;
         cout<<"D. "<<odpD[i]<<endl;

         cout<<"Twoja odpowiedz:";
         cin>>odp;

         transform(odp.begin(),odp.end(),odp.begin(), ::tolower);

         if (odp==poprawna_odp[i])
         {
             cout<<"Gratulacje! Dobra odpowiedz!"<<endl;
             punkty++;
         } else cout<<"Bledna odpowiedz. Poprawna odpowiedz:" <<poprawna_odp[i]<<endl;
    }
    cout<<endl<<"Koniec gry! Twoje punkty:"<<punkty;

    return 0;
}

POBIERZ KOMPLETNY FOLDER

POBIERZ SAM PLIK TEKSTOWY

komentarz zamknięcia: Rozwiązanie problemu.

2 odpowiedzi

+1 głos
odpowiedź 5 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 5 kwietnia 2018 przez Marcin Reguła
 
Najlepsza

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;
}

 

komentarz 5 kwietnia 2018 przez Marcin Reguła Początkujący (450 p.)
Dziękuję za odpowiedź. Wiele mi ona pomogła a i sam patrząc dziś świeżym okiem dokończyłem kod. Jeszcze raz wielkie dzięki!
–1 głos
odpowiedź 4 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
edycja 5 kwietnia 2018 przez Beginer

Może źle działa funkcja zamiany na małe litery, spróbuj wziąć w komentarz, lub:

transform(odp.begin(), odp.end(), odp.begin(), ::toupper);   //zamiana na duze litery

P.S. Nie widziałem folderu ani pliku tekstowego. Ale z tego, co piszesz oraz z samego kodu wynika, że dane (odpowiedzi) wczytują się prawidłowo. W pętli for trzeba zwiększyć warunek na: int i < 5 (teraz jest < 4). Powinno hulać!

Podobne pytania

0 głosów
1 odpowiedź 954 wizyt
0 głosów
1 odpowiedź 843 wizyt
pytanie zadane 8 stycznia 2017 w C i C++ przez Gambr Dyskutant (7,530 p.)
0 głosów
1 odpowiedź 311 wizyt
pytanie zadane 19 stycznia 2018 w C i C++ przez foruminfa Początkujący (310 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...