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

Program wysypuje się

Object Storage Arubacloud
0 głosów
319 wizyt
pytanie zadane 13 października 2017 w C i C++ przez styrczu Obywatel (1,050 p.)
edycja 13 października 2017 przez criss

Witam, mam problem otóż program wysypuje się przy 33 powtórzeniu pętli while(getline(f1,l)). Jako błąd debbuger pokazuję Program received signal SIGSEGV, Segmentation fault. In std::string::assign(std::string const&) () oraz Nie można odnaleźć lub otworzyć pliku PDB. Macie jakieś sugestię?

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    string Q[5];
    string A[5],B[5],C[5],D[5];
    string CA[5];
    fstream f1;
    string l;
    string topic,author;
    string answer;
    int nr_l=1;
    int nr_q=0;
    int points=0;
    f1.open("Quiz.txt",ios::in);
    if(f1.good()==false)
    {
        cout<<"The file does not exist"<<endl;
        exit(0);
    }
    while(getline(f1,l))
    {
        switch(nr_l)
        {
            case 1: topic=l;            break;
            case 2: author=l;          break;
            case 3: Q[nr_q]=l;        break;
            case 4: A[nr_q]=l;        break;
            case 5: B[nr_q]=l;        break;
            case 6: C[nr_q]=l;        break;
            case 7: D[nr_q]=l;        break;
            case 8: CA[nr_q]=l;      break;
        }
        if(nr_l==8)
        {
            nr_l=2;
            nr_q++;
        }
        nr_l++;
    }
    f1.close();
    cout<<"The topic of the quiz is: "<<topic<<endl;
    cout<<"The author of a quiz is: "<<author<<"\n\n"<<endl;
    for(int i=0;i<=4;i++)
    {
        cout<<Q[i]<<endl;
        cout<<"A. "<<A[i]<<endl;
        cout<<"B. "<<B[i]<<endl;
        cout<<"C. "<<C[i]<<endl;
        cout<<"D. "<<D[i]<<endl;
        cout<<"Your Answer is: ";
        cin>>answer;
        transform(answer.begin(),answer.end(),answer.begin(), ::tolower);
        if(answer==CA[i])
        {
            cout<<"\n"<<"Correct answer.You earned 1 point."<<endl;
            points++;
        }
        else cout<<"Wrong answer.The correct answer is "<<CA[i]<<endl;
    }
    cout<<"A quiz has been finished. You earned "<<points<<" Congratulations!"<<endl;
    return 0;
}

2 odpowiedzi

0 głosów
odpowiedź 13 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 13 października 2017 przez criss
 
Najlepsza

Tak po szybkim zajrzeniu w kod - skąd masz pewność, że wszystkie pytania zmieszczą się w twoich tablicach? Przecież wczytujesz dane z pliku do końca (while), bez żadnych ograniczeń. smiley

komentarz 13 października 2017 przez styrczu Obywatel (1,050 p.)
W zasadzie nie mam, ale co powinienem w tej sytuacji zrobić?
komentarz 13 października 2017 przez niezalogowany
Sposób przedstawiony przez MZ jest daleki od ideału. Kilka przykładowych implementacji znajdziesz w CR do tego odcinka
komentarz 13 października 2017 przez j23 Mędrzec (194,920 p.)

ale co powinienem w tej sytuacji zrobić?

Zobacz, czy przypadkiem na końcu pliku nie masz pustej linii.

 

Tak bym zrobił:

getline(f1, topic);
getline(f1, author);

while(nr_q < 5)
{
    getline(f1, Q[nr_q])
    getline(f1, A[nr_q]);
    getline(f1, B[nr_q]);
    getline(f1, C[nr_q]);
    getline(f1, D[nr_q]);
    getline(f1, CA[nr_q]);
    if(!f1) break;
    ++nr_q;
}

 

 

komentarz 13 października 2017 przez styrczu Obywatel (1,050 p.)
Faktycznie miałem jeszcze 2 puste ostatnie linijki kodu. Ale zobaczyłem ze twój zapis jest po prostu klarowniejszy bez zbędnych zmiennych. Dzięki Wielkie, program działa tak jak chciałem
–1 głos
odpowiedź 13 października 2017 przez obl Maniak (51,280 p.)

Powinieneś sprawdzać, czy nie natrafiłeś na koniec pliku:

while(!f1.eof())

 

Podobne pytania

0 głosów
0 odpowiedzi 222 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez Kuba Kawa Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 215 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...