• 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
312 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 213 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez Kuba Kawa Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 207 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...