[C++] str.erase() probleem

Pagina: 1
Acties:

  • Denzo
  • Registratie: Augustus 2007
  • Laatst online: 09-11 00:50
Ik krijg een error bij dit stukje code:

C++:
1
2
3
4
5
6
    scoreadd = "-scores.txt";
    toetslengte = toets.length();
    toetslengte2 = toetslengte - 4;
    toets = toets2;
    toets2.erase(toetslengte2, 4);
    scores = toets2 + scoreadd;


Het doel is om van de string toets ( bevat de toetsnaam + .txt, dus toets.txt of nederlands.txt , dit wordt aan het begin ingevult.) .txt af te halen en er "-scores.txt" aan toe te voegen zodat je toets-scores.txt krijgt als toets.txt is ingevult. Het totale programma compileert prima alleen ik krijg deze error hij bij het stukje komt waar toets2.erase() wordt gebruikt:
quote: Error
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase
Aborted (core dumped)
Mijn complete code voor degene die het nodig hebben:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string naam, toets, toets2, scores, scoreadd;
    int keuze, toetslengte, toetslengte2;

    cout << "Welkom bij ZelfToets++!" << endl;
    cout << "Geef alstublieft je naam in: ";
    cin >> naam;
    cout << "\nTyp de bestandsnaam van de toets die je wil maken, bijv. toets.txt\n" << endl;
    cin >> toets;
    cout << "\n1) Maak de toets\n2) Bekijk de scores van deze toets.\n" << endl;
    cin >> keuze;

    scoreadd = "-scores.txt";

    toetslengte = toets.length();
    toetslengte2 = toetslengte - 4;
    toets = toets2;
    toets2.erase(toetslengte2, 4);
    scores = toets2 + scoreadd;

    cout << scores;

    switch (keuze)
    {
        case 1:
    {
    string vraag, antwoord, input;
    int vg = 0;
    int v = 0;

    ifstream toetsbestand(toets.c_str());

        if (toetsbestand.is_open())
        {
            while (! toetsbestand.eof() )
            {
            getline (toetsbestand,vraag,'|');
            getline (toetsbestand,antwoord);

            if (vraag.size() == 0)
            {
                break;
            }

            cout << "\n" << vraag << endl;
            cout << "\n";
            cin >> input;

                if (input == antwoord)
                {
                    cout << "\nCorrect! Je je antwoord was goed. Het was inderdaad " << antwoord << "!" << endl;
                    vg++;
                }
                else
                {
                     cout << "\nSorry, je had het niet goed. Het goede antwoord was " << antwoord << "." << endl;
                }
                v++;
            }

            toetsbestand.close();

            cout << "\nOk, we zijn klaar!" << endl;
            cout << "\nJe had " << vg << " van de " << v << " vragen goed, " << naam << endl;
            cout << "Nu gaan we de scores naar het bestand schrijven";

        }

        else
        {
        cerr << "\nDeze toets bestaat niet, of het bestand is al in gebruik!";
        getchar();
        }
    } break;

    case 2:
    {
        // Doe iets
    } break;

    default:
    {
        cout << "Je moet 1 of 2 invullen!" << endl;
    } break;

    }

getchar();
return 0;

}


Het hele toets geval werkt al, ik ben nu alleen bezig om een scoresysteem toe te voegen, en daarvoor moet ik eerst een correcte scorebestandsnaam hebben.

Alvast bedankt voor de mensen die hier zullen reageren _/-\o_

P.S. Ben nog niet zo lang bezig met C++ :)

Verwijderd

out_of_range...

Ik ben geen doorgewinterde C++ programmeur, maar...

Klinkt alsof jij meer tekst probeert te verwijderen dan dat er bestaat. Bijv. 4 chars verwijderen op tekst van 3 chars. Probeer daar eens mee te kloten? :)

[ Voor 14% gewijzigd door Verwijderd op 02-06-2008 12:08 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

toets2 is leeg, er staat toets = toets2, maar toets2 is niet geinitialiseerd.

Dat zal wel toets2 = toets; moeten zijn... :)

[ Voor 24% gewijzigd door Zoijar op 02-06-2008 12:17 ]


  • Denzo
  • Registratie: Augustus 2007
  • Laatst online: 09-11 00:50
Zoijar schreef op maandag 02 juni 2008 @ 12:16:
toets2 is leeg, er staat toets = toets2, maar toets2 is niet geinitialiseerd.

Dat zal wel toets2 = toets; moeten zijn... :)
Wat een stomme fout van me 8)7
Dat werkte, bedankt!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Er bestaat trouwens ook string::insert, of std::copy. Als er nu geen .txt achter staat klopt het niet meer, of als iemand maar 3 karakters intyped. Ik zou toch iets met find() doen. Of laat ze gewoon geen extensie intypen

  • Denzo
  • Registratie: Augustus 2007
  • Laatst online: 09-11 00:50
Ik ben nu tegen nog een probleem aangelopen. Als hij de score naar het bestand schrijft, dan vervangt hij de oude score.

  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37

ATS

Ik ben nu tegen nog een probleem aangelopen. Als hij de score naar het bestand schrijft, dan vervangt hij de oude score.
File openen in append mode, in plaats van in write mode.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Denzo
  • Registratie: Augustus 2007
  • Laatst online: 09-11 00:50
ATS schreef op maandag 02 juni 2008 @ 13:16:
[...]

File openen in append mode, in plaats van in write mode.
Bedankt :>
Pagina: 1