vector!! push_back bug in c++ prog.

Hello there. Im working with a bank program in console c++. I have faced a problem i can't solve now. When im shuting down the program with my exit function, It is supose to load all the data into a file.txt.
It does this, But it also adds an account with no name, No accountnumber and no balance.

This is my complete code for the moment.
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <vector>
#include <time.h>

using namespace std;


struct banken //struct som innehåller det som ett "konto" skall innehålla. Dvs ett namn ett kontonummer och ett saldo.
{
    string Namn;
    int KontoNr;
    double Saldo;
};
void Meny(vector<banken>& BankVekt);//Säger till kompilatorn att jag kommer att kalla på dessa funktioner senare i programmet.
void DpCash(vector<banken>& BankVekt);//--||--
void VisaKonto(vector<banken>& BankVekt);//--||--
void VisaSaldo(vector<banken>& BankVekt);//--||--
void WthCash(vector<banken>& BankVekt);//--||--
void Avsluta(vector<banken>& BankVekt);//--||--
void DeleteAcc(vector<banken>& BankVekt);//--||--

banken SkapaKonto(string Namn,int KontoNr,double Saldo)
{
    banken b;
    b.Namn=Namn;
    b.KontoNr=KontoNr;
    b.Saldo=Saldo;
    return b;
}
void CreateAcc(vector <banken>& BankVekt) // Funktion för att skapa ett konto
{
    system("cls");
    srand(time(NULL)); // Skapar srand som skall använda sig av tiden som behållare för ett slumpat tal
    int RandTal=rand()%100; // Ger slumptalet namnet RandTal och säger åt den att slumpa tall upp till 100
    string namn;

    cout<<"Skriv '<' for att komma till huvudmenyn\n";
    cout<<"Skriv ditt namn tack: ";
    getline(cin,namn);
    if(namn=="<")
    {
        system("cls");
        Meny(BankVekt);
    }
    else
    {
    BankVekt.push_back(SkapaKonto(namn,RandTal,0)); // Lägger SkapaKontons värden dvs Namn Kontonummer och Saldo längst bak i min vector.
    system("cls");
    cout<<"Du har aktiverat ett konto med namnet: " <<namn<<endl<< "Och har tilldelats kontonummer "<<RandTal<<endl
    <<"ditt saldo ar for tilfallet 0 Kronor\n";
    Sleep(3000);
    system("cls");
    Meny(BankVekt);
    }
    return;
}

void Meny(vector<banken>& BankVekt) // Min Meny.
{
string val;
cout<<"1) Visa saldo\n2) Ta ut pengar\n3) Sätt in pengar\n4) Visa alla konton\n5) Skapa nytt konto\n6) Ta bort ett befintligt konto\n7) Avsluta programmet\nVar god valj ett alternativ\n";
getline(cin,val);
if(val=="1")
{
    VisaSaldo(BankVekt);//visa saldo funk
}
else if(val=="2")
{
   WthCash(BankVekt);// ta ut pengar funk
}
else if(val=="3")
{
    DpCash(BankVekt);//Sätt in pengar funk
}
else if(val=="4")
{
        VisaKonto(BankVekt);//Visa alla konton funk
}
else if(val=="5")
{
    CreateAcc(BankVekt);// skapa konto funk
}
else if(val=="6")
{
        DeleteAcc(BankVekt);//ta bort konto funk
}
else if(val=="7")
{
    Avsluta(BankVekt); // Avsluta program funk.
}

else if(val=="<")
    {
        system("cls");
        Meny(BankVekt);
}
else

{
    cout<<"Felaktigt val, var god prova igen\n";
    Sleep(2000);
    system("cls");
    Meny(BankVekt);
}


return;
}

void DpCash(vector<banken>& BankVekt) // sätta in pengar funktion
{
system("cls");

int KontoNr,Okas;

    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom vectorns konton.
    cout << endl << "NAMN: " << it->Namn << endl << "NUMMER: " << it->KontoNr << endl // Skriver ut Namn Nummer och saldo.
    << "SALDO: " << it->Saldo << endl << endl;
    }

cout<<"Ange kontonummer"<<endl;
cin>>KontoNr;

cout<<"Hur mycket vill du satta in?"<<endl;
cin>>Okas;

for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom vectors konton.
if(it->KontoNr==KontoNr) // Om iteratorns KontoNr är lika med KontoNr så ökas saldot med det värde som användaren matat in.
{
it->Saldo+=Okas;
}
}
Meny(BankVekt);
return;
}

void VisaKonto(vector<banken>& BankVekt) // Visa konton funktion
{

    system("cls");
    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom vector och skriver sedan ut både namn nummer och saldo på skärmen.
    cout << endl << "NAMN: " << it->Namn << endl << "NUMMER: " << it->KontoNr << endl
    << "SALDO: " << it->Saldo << endl << endl;
    }
    Meny(BankVekt);
}

void VisaSaldo(vector<banken>& BankVekt) // Visa saldo funktionen.
{
    system("cls");
    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom min vector efter konton.
    cout << endl << "NAMN: " << it->Namn << endl << "NUMMER: " << it->KontoNr<< endl << endl;// Och skriver sedan ut Namn och kontonummer på skärmen ifall man har glömt bort sitt nummer
    }

    int KontoNr;
    cout<<"Ange kontonummer"<<endl;
    cin>>KontoNr;

    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom konton en gång till
        if(it->KontoNr==KontoNr)
        {
            cout<<"Ditt saldo = "<<it->Saldo<<endl; // Och skriver sedan ut endast saldot på det kontonummer som skrivits in.
        }

    }
    system("PAUSE");
    system("cls");
    Meny(BankVekt);
return;
}
void WthCash(vector<banken>& BankVekt) // Ta ut pengar funktionen.
{
    system("cls");
    int KontoNr,Minskas;

    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom min vector för att kolla vilka konton som finns
    cout << endl << "NAMN: " << it->Namn << endl << "NUMMER: " << it->KontoNr << endl// och skriva ut dem och dess innehåll på skärmen
    << "SALDO: " << it->Saldo << endl << endl;}

    cout<<"Ange Kontonummer\n";
    cin>>KontoNr;
    cout<<"Hur mycket vill du ta ut?\n";
    cin>>Minskas;

    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ //Itererar igenom min vector efter konton.
    {it->Saldo-=Minskas;} // Minskar sedan Saldo med så mycket som användaren matade in. Dvs variablen 'Minskas'.
}
    system("cls");
    Meny(BankVekt);

}

void Avsluta(vector<banken>& BankVekt)
{
    ofstream SkrivTillFil;
    SkrivTillFil.open("konton.txt");

    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){ // Itererar igenom min vector för att kolla vilka konton som finns
    cout << endl << "NAMN: " << it->Namn << endl << "NUMMER: " << it->KontoNr << endl// och skriva ut dem och dess innehåll på skärmen
    << "SALDO: " << it->Saldo << endl << endl;}

    if (SkrivTillFil)
{
    for(vector<banken>::iterator it = BankVekt.begin(); it != BankVekt.end(); ++it){
    SkrivTillFil << it->Namn << "#" << it->KontoNr << "#" << it->Saldo << endl;
}
}
else
{

   cout << "Kunde ej spara!" << endl;
}
SkrivTillFil.close();
exit(1);//Avsluta
}
}
int main()
{
    vector<banken> BankVekt; // Min vector som jag använder för att lagra mina konton i.
    string FilRad;

    ifstream MinFil;
    MinFil.open("konton.txt");

    while(MinFil) //while snurra som läser igenom min fil.
    {
        banken temp;
        getline(MinFil,FilRad);//Läser igenom min skapade fil och en rad i taget.
        string n;//namn
        int kn;//Kontonummer
        double s;//saldo

        n=FilRad.substr(0,FilRad.find("#"));//Läser in en rad(string) som börjar på noll och slutar på "#".
        FilRad.erase(0,FilRad.find("#")+1);//Tar sedan bort raden och ger den +1 för att även ta bort "#"

        kn = atoi(FilRad.substr(0,FilRad.find("#")).c_str()); // Använder en gammal C funktion som gör en string till en int för att kunna läsa in kontonummer som endast består av heltal.
        FilRad.erase(0,FilRad.find("#")+1);

        s = atof(FilRad.substr(0,FilRad.find("#")).c_str()); // Använder en gammal C funktion som gör en string till en double för att läsa in saldo som kan innehålla decimaltal.
        FilRad.erase(0,FilRad.find("#")+1);

        temp.Namn = n;
        temp.KontoNr = kn;
        temp.Saldo = s;
        BankVekt.push_back(temp);
    }
    MinFil.close();
    Meny(BankVekt);

    return 0;
}

If any of you guys can spot the error in my code and find out whats wrong it would be lovley. The comments is in swedish and i am sorry for that, But u dont have to mind the comments if you cant read swedish.
Thanks /Johannes
Last edited on
I think the problem is with the loop in the main function. The stream will stay valid until you try make a read that fails. When you have read everything in the file the loop will make one iteration more but then getline fails and you get an empty string. Test the return of getline in the loop condition instead.
while(getline(MinFil,FilRad))
Yes thank you it worked :)
Topic archived. No new replies allowed.