[c++] bugje

Pagina: 1
Acties:

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
hallo, ik ben een factureerprogramma aan het schrijven(als opdracht), nu heb ik een bugje waar ik maar niet uitkom..
het volgende stukkie telt het laatste bedrag dat ik de betalingen database staat als inkoop 2x bij inkopen op? kan iemand me vertellen waar het aan ligt, ikheb al 2 vellekes papier volgeklad, en vanalles getest maar het lukt me niet..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct klanten
    {
    char knaam[40];
    char kadres[40];
    char plaats[30];
    char telnr[10];
    int debcre;
    long knr;
    long banknr;
    };

struct betalingen
    {
    float bedrag;
    long knr;
    char datum[20];
    char omschrijving[200];
    int betaald;
    };


code:
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
 float verkopen=0;
 float inkoop=0;


 ifstream f("betalingen.dat", ios::in|ios::binary|ios::trunc);
 ifstream e("klanten.dat", ios::in|ios::binary|ios::trunc);

 while (!f.eof())
 {
    f.read((char *) &bet, sizeof(bet));
    while(!e.eof())
    {
        e.read((char *) &klant, sizeof(klant));
        if (klant.knr==bet.knr)//als de klant bestaat
        {
                
            if (klant.debcre==1)//als het van een debiteur is
            {
                verkopen=verkopen+bet.bedrag;
                //cout<<verkopen;
            }
            else if(klant.debcre==0)//als het van een crediteur is
            {
                inkoop=inkoop+bet.bedrag;

            }
            else
            {
            }

        }
    }
    e.clear();//reset control state anders kan je hem niet van eof af halen
    e.seekg(0, ios::beg);

 }
 f.close();
 e.close();

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:50
De end-of-file flag wordt pas ingesteld op het moment dat je probeert voorbij het einde van het bestand te lezen. Als je dus een bestand hebt van tien bytes, waar je tien bytes uit leest, dan is de end-of-file flag nog niet geset. Pas wanneer je een elfde byte probeert te lezen, wordt de end-of-file flag ingesteld.

Wanneer je het laatste record hebt ingelezen, is f.eof() dus nog steeds false en ga je nog een keer de lus in. Je read failed dan, omdat er geen data meer is (en op dat moment wordt de eof-flag ingesteld), dus blijft het laatste record in het geheugen zitten. Deze wordt nog een keer opgeteld.

De oplossing is dus om niet naar f.eof() te kijken, maar simpelweg door te gaan tot f.read() niet meer wil. Je krijgt dan dus 'while(f.read(...))' als buitenste lus.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op woensdag 29 mei 2002 00:16 schreef Soultaker het volgende:
De end-of-file flag wordt pas ingesteld op het moment dat je probeert voorbij het einde van het bestand te lezen. Als je dus een bestand hebt van tien bytes, waar je tien bytes uit leest, dan is de end-of-file flag nog niet geset. Pas wanneer je een elfde byte probeert te lezen, wordt de end-of-file flag ingesteld.

Wanneer je het laatste record hebt ingelezen, is f.eof() dus nog steeds false en ga je nog een keer de lus in. Je read failed dan, omdat er geen data meer is (en op dat moment wordt de eof-flag ingesteld), dus blijft het laatste record in het geheugen zitten. Deze wordt nog een keer opgeteld.

De oplossing is dus om niet naar f.eof() te kijken, maar simpelweg door te gaan tot f.read() niet meer wil. Je krijgt dan dus 'while(f.read(...))' als buitenste lus.
ohh zo, superbedankt! :), dit lost ook superveel andere problemen op!!!!! d100x dank ;) :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

[c++] bugje
zou je misschien in het vervolg een iets duidelijkere topictitel kunnen verzinnen, waarin het onderwerp van je probleem een beetje staat aangegeven? (wees eens creatief) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:30
Heb je al eens gedebugged? Zo zul je vlug zien waar je fout zit en hoe het komt dat uw bedrag 2x opgeteld wordt.

https://fgheysels.github.io/