Toon posts:

[C++] probleempje met bestanden

Pagina: 1
Acties:

Verwijderd

Topicstarter
voor mijn eindwerk van school moet ik een programma schrijven in C++, dat gebruik maakt van bestanden

ik maak gebruik van 3 bestanden

code:
1
2
3
#define K "klanten.txt"
#define P "producten.txt"
#define B "best.txt"


en ik maak gebruik van de volgende structures

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
typedef struct {
    char naam[20];
    char voornaam[20];
    char adres[30];
    char gebdatum[15];
    char gemeente[20];
    char postcode[4];
} klanten;

typedef struct {
    char naam[20];
    int voorraad;
    float prijs;
} producten;

typedef struct {
    char knaam[20];
    char voornaam[20];
    char pnaam[20];
    int aantal;
} bestellingen;

bestellingen bestelling;
klanten klant;
producten product;


tot zover is nog alles ok
ik heb deelprogramma's voor het invoeren, bewerken, verwijderen van klanten, producten en bestellingen

maar nu komt het probleem, vanaf het moment dat ik mijn bestellingen wil afdrukken op het scherm, hangt men programma
het lijkt bijna alsof hij het bestand niet kan openen om te lezen, maar alleen om te schrijven

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void drukbestellingen()
{int teller=0;
titel("Geplaatste bestellingen");
ifstream bestand(B,ios::in | ios::binary);
bestand.read((char *)&bestelling,sizeof(bestellingen));

while (!bestand.eof());
{   cout << "Naam klant : " << bestelling.knaam << endl;
    cout << "Voornaam klant : " << bestelling.voornaam << endl;
    cout << "Naam product : " << bestelling.pnaam << endl;
    cout << "Aantal besteld : " << bestelling.aantal << endl << endl;

    teller++;
    if ((teller % 4) == 0) 
    {   getch();
        titel("Geplaatste bestellingen");
    }
    bestand.read((char *)&bestelling,sizeof(bestellingen));
}

bestand.close();
getch();
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void drukklanten()
{int teller=0;
titel("Klanten");
ifstream bestand(K,ios::in | ios::binary);
bestand.read((char *)&klant,sizeof(klanten));

while (!bestand.eof())
{   cout << "Naam          : " << klant.naam << endl;
    cout << "Voornaam      : " << klant.voornaam << endl;
    cout << "Adres         : " << klant.adres << endl;
    cout << "Gemeente      : " << klant.gemeente << endl;
    cout << "Postcode      : " << klant.postcode << endl;
    cout << "Geboortedatum : " << klant.gebdatum << endl << endl;

    teller++;
    if ((teller % 3) == 0) 
    {   getch();
        titel("Klanten");
    }

    bestand.read((char *)&klant,sizeof(klanten));
}


het deelprogramma drukklanten werkt perfect, terwijl het deelprogramma drukbestellingen alleen de titel weergeeft, waarna mijn programma zichzelf vasthangt :/

ohja, voor ik het vergeet, men compiler (MS Visual C++ 6.0) geeft geen error's

Verwijderd

kan het hier aan liggen?
ifstream bestand(B,ios::in | ios::binary);
Misschien anders parameters meegeven.

Verwijderd

Topicstarter
ik heb nu net even geprobeerd om met een tekstbestand te werken ipv een binair bestand, nu is het probleem gedeelte lijk opgelost

de gegevens worden nu afgedrukt op het scherm, maar het programma hangt nu nadat het laatste gegeven is afgedrukt

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
void drukbestellingen()
{int teller=0;
char a[20], b[20], c[20];
int d;
titel("Geplaatste bestellingen");
ifstream bestand(B,ios::in);

    bestand.getline(a,20);
    bestand.getline(b,20);
    bestand.getline(c,20);
//  bestand.getline(d,sizeof(d));

    cout << a << " " << b << " " << c << " " << endl;


while (!bestand.eof());
{   

    teller++;
    if ((teller % 4) == 0) 
    {   getch();
        titel("Geplaatste bestellingen");
    }
    
    bestand.getline(a,20);
    bestand.getline(b,20);
    bestand.getline(c,20);
//  bestand.getline(d,sizeof(d));

    cout << a << " " << b << " " << c << " " << endl;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

binary kan wel het best gebruikt worden om structures direct weg te schrijven en in te lezen. Op welke regel blijft ie precies hangen (in je eerste code-voorbeeld bedoel ik dan)? En hoe schrijf je ze precies weg?

Overigens is .txt als extensie voor een binary bestand niet echt intuitief natuurlijk :)

Verder nog wat opmerkingen:
- Om highlighting te doen voor C++ code op GoT moet je [norml]
C++:
1
...
[/] doen
- Gebruik geen defines voor constanten. Je kunt in jouw geval beter die defines vervangen door const char [] definities (overigens is 1 letter ook niet echt mooi)
- In C++ hoef je geen typedef voor structs te doen; je kunt ze automatisch met die naam aanspreken.

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.


Verwijderd

Topicstarter
- die variabelen van 1 teken lang had ik ff gebruikt om te testen
- nice to know voor highlighting :)
- als we de declaraties niet gebruiken volgens onze leerkracht haar methode, krijgen we punten af, ook al werkt et :), don't ask me why

om de een af andere vage reden ligt de error bij de while lus

met deze code:
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
void drukbestellingen()
{int teller=0;
char temp[20];
titel("Geplaatste bestellingen");
ifstream bestand(B,ios::in);

do {
        bestand.getline(temp,20);
        bestand.getline(bestelling.knaam,20);
        bestand.getline(bestelling.pnaam,20);
        bestand.getline(bestelling.voornaam,20);

        bestelling.aantal = atoi(temp);
        
        if (strcmp(bestelling.knaam,"")!=0) {

        cout << "Naam klant     : " << bestelling.knaam << endl;
        cout << "Voornaam klant : " << bestelling.voornaam << endl;
        cout << "Naam product   : " << bestelling.pnaam << endl;
        cout << "Aantal         : " << bestelling.aantal << endl << endl;

        }
        teller++;
        if ((teller % 4) == 0) 
        {   getch();
            titel("Geplaatste bestellingen");
        }

    } while(!bestand.eof());

bestand.close();
cout << endl;
getch();
}



werkt het wel, hoewel beide net hetzelfde doen volgens mij, raar, maarja, het werkt nu

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh :D
er staat een ; achter je while in drukbestellingen () (zie mijn comment op regel 8 ):

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
void drukbestellingen()
{int teller=0;
titel("Geplaatste bestellingen");
ifstream bestand(B,ios::in | ios::binary);
bestand.read((char *)&bestelling,sizeof(bestellingen));

while (!bestand.eof());
//* * * * * * * * * * ^ deze moet weg * * * * * * * * *
{   cout << "Naam klant : " << bestelling.knaam << endl;
    cout << "Voornaam klant : " << bestelling.voornaam << endl;
    cout << "Naam product : " << bestelling.pnaam << endl;
    cout << "Aantal besteld : " << bestelling.aantal << endl << endl;

    teller++;
    if ((teller % 4) == 0) 
    {   getch();
        titel("Geplaatste bestellingen");
    }
    bestand.read((char *)&bestelling,sizeof(bestellingen));
}

bestand.close();
getch();
}

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.

Pagina: 1