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

Program wysypuje się

VPS Starter Arubacloud
0 głosów
436 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 (195,220 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 248 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez Kuba Kawa Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 245 wizyt

93,023 zapytań

141,986 odpowiedzi

321,288 komentarzy

62,369 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...