Toon posts:

[c++] database maken in bestand en weer uitlezen?

Pagina: 1
Acties:
  • 263 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
hallo,
ik ben een programma aan het schrijven en ik wil dat mensen gegevens kunnen invullen die dan vervolgens in een bestand opgeslagen worden..en dan moet je weer kunnen zoeken op naam enz.
weet iemand hoe dit moet?
heef iemand wat voorbeelden?

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

wat heeft het opslaan van gegevens in een bestand te maken met een database? of wil je je eigen databse engine gaan schrijven? ;)

* GraasGast heeft geen verstand van c++

Verwijderd

Topicstarter
dat is dan toch een database
het is geen sql ofzo
maar er staat data in en het is een base dus :P

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Zoek eens naar 'ifstream' en 'ofstream' (op internet/help), die vergemakkelijken het inlezen/uitlezen van bestanden.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

Verdeel het probleem in subproblemen, en los die stuk voor stuk op.

Het belangrijkste waar je mee moet beginnen is hoe je het in het bestand zet. Zorg ervoor dat je op 1 of andere manier aangeeft waar bepaalde velden en records beginnen, en zorg er daarna voor dat die scheidingen niet binnen een veld voor kunnen komen.

Als je dit af hebt, kun je eens gaan kijken hoe je dit wegschrijft en inleest

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Op donderdag 22 maart 2001 14:44 schreef Janoz het volgende:
Verdeel het probleem in subproblemen, en los die stuk voor stuk op.

Het belangrijkste waar je mee moet beginnen is hoe je het in het bestand zet. Zorg ervoor dat je op 1 of andere manier aangeeft waar bepaalde velden en records beginnen, en zorg er daarna voor dat die scheidingen niet binnen een veld voor kunnen komen.

Als je dit af hebt, kun je eens gaan kijken hoe je dit wegschrijft en inleest
aka een soort db-engine ;)

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Kan je niet een XML DOM/SAX objectje gebruiken? Ben je van het gezeik van een dataformaat keizen in ieder geval af.

  • Stealth2000
  • Registratie: December 2000
  • Laatst online: 02-06 10:00
Hopelijk heb je hier wat aan, het betreft de functies saven en loaden die ik vorig jaar ff heb geschreven voor een school project. Ik schrijf hier elk object uit een vector apart weg en geef deze een ID waarmee deze makkelijker te laden is. ;)
[c++]
void SaveLoad::Saven( char* filenaam, ProjectManager *pm, ActiviteitManager *am, TimerManager *tm )
{
DWORD dwBytesWritten;

bProject Proj;
bActiviteit Act;
bTimer Timer;

pmr = pm;
amr = am;
tmr = tm;

HANDLE hFileWrite = CreateFile( filenaam, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

for( int i = 0; i < pmr->ProjVector.size(); i++ )
{
strcpy( Proj.bNaam, pmr->findProjectByNr(i).getOmschrijving() );
strcpy( Proj.bNotitie, pmr->findProjectByNr(i).getNotitie() );
strcpy( Proj.bStatus, pmr->findProjectByNr(i).getStatus() );
Proj.bDeadline = pmr->findProjectByNr(i).getDeadline().getTijd();
Proj.bTotalTime = pmr->findProjectByNr(i).getTotaleTijd().getTijd();

WriteFile(hFileWrite, &PROJECT_ID, sizeof( PROJECT_ID ), &dwBytesWritten, NULL );
WriteFile(hFileWrite, &Proj , sizeof( bProject ), &dwBytesWritten, NULL );
}
/*
for( int i = 0; i < am.ActVector.size(); i++ )
{
strcpy( Act.bNaam, pmr.findProjectByNr(i).getOmschrijving() );
strcpy( Act.bNotitie, pmr.findProjectByNr(i).getNotitie() );
strcpy( Act.bStatus, pmr.findProjectByNr(i).getStatus() );
Proj.bDeadline = pmr.findProjectByNr(i).getDeadline().getTijd();
Proj.bTotalTime = pmr.findProjectByNr(i).getTotaleTijd().getTijd();

WriteFile(hFileWrite, &ACTIVITEIT_ID, sizeof( ACTIVITEIT_ID ), &dwBytesWritten, NULL );
WriteFile(hFileWrite, &Proj , sizeof( bProject ), &dwBytesWritten, NULL );
}

for( int i = 0; i < tm.TimeVector.size(); i++ )
{
strcpy( Proj.bNaam, pmr.findProjectByNr(i).getOmschrijving() );
strcpy( Proj.bNotitie, pmr.findProjectByNr(i).getNotitie() );
strcpy( Proj.bStatus, pmr.findProjectByNr(i).getStatus() );
Proj.bDeadline = pmr.findProjectByNr(i).getDeadline().getTijd();
Proj.bTotalTime = pmr.findProjectByNr(i).getTotaleTijd().getTijd();

WriteFile(hFileWrite, &TIMER_ID, sizeof( TIMER_ID ), &dwBytesWritten, NULL );
WriteFile(hFileWrite, &Proj , sizeof( bProject ), &dwBytesWritten, NULL );
}
*/
CloseHandle( hFileWrite );
}

void SaveLoad::Loaden( char* filenaam, ProjectManager *pm, ActiviteitManager *am, TimerManager *tm )
{
bProject Proj;
bActiviteit Act;
bTimer Timer;

Project np;
Activiteit na;
//Timer nt;

pmr = pm;

DWORD dwBytesRead;

HANDLE hFileRead = CreateFile( filenaam, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

ReadFile( hFileRead, &read_id, sizeof(PROJECT_ID), &dwBytesRead, NULL);
while( dwBytesRead != 0 )
{
switch( read_id )
{
case PROJECT_ID:

ReadFile( hFileRead, &Proj, sizeof( bProject ), &dwBytesRead, NULL);

np.setOmschrijving( Proj.bNaam );
np.setNotitie( Proj.bNotitie );
np.setStatus( Proj.bStatus );
np.setTotaleTijd( Proj.bTotalTime );
np.setDeadline( Proj.bDeadline );

pmr->addProject( np );
break;
/*
case ACTIVITEIT_ID:

ReadFile( hFileRead, &Act, sizeof( bActiviteit ), &dwBytesRead, NULL );



//amr.addActiviteit(

//am = pm.FindProject( PS.Omschrijving ) ->GetActiviteiten();
break;

case TIMER_ID:
break;*/

default:
break;
}
ReadFile( hFileRead, &read_id, sizeof(PROJECT_ID), &dwBytesRead, NULL);
}
CloseHandle( hFileRead );
}
[/c++]

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
[quote]Op zondag 14 oktober 2001 23:08 schreef Stealth2000 iets de en ook veel code

- Voorwaarde is dat meneer onder Win32 progt, anders gaat dit niet lukken.
- Het is meer c met een klasse smaakje dan c++.
- Probeer het toch eens met iostreams (c++), of fgetc/fputc (c). Zo leren we nooit om onder iets anders dan de Win32 API te proggen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

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
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
 /***************************************************
 * CODE FILE:       Cijfer.cpp
 * Autheur:         Bas en JavaRules
 * Beschrijving:    Een programma om de resultaten 
 *                  van een leerling te kunnen zien.
 */

#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <string.h>

//array van pointers maken
char * naam[25];

//array van pointers maken
double * cijfer[25];

//geeft het aantal cijfers dat een persoon heeft aan
int aantal[25];
int personenTeller=0;

//de input vanuit de file
void invoer(void)
{
    ifstream ifs("CijferData.txt", ifstream::nocreate|ios::in);
    if (!ifs)
    {
        cout << "Fout bij het lezen uit bestand.\n" << endl;
        exit(EXIT_FAILURE);
    }

    int teller = 0;
    char naamInvoer[100];
    double cijferInvoer[8];

    while(ifs >> naamInvoer) // lees naam uit bestand
    {
        naam[personenTeller] = new char [strlen(naamInvoer) + 1];
        strcpy(naam[personenTeller],naamInvoer);

        while(ifs >> cijferInvoer[teller] && teller<8) // lees maximaal 8 cijfers uit bestand
            teller++;

        cijfer[personenTeller] = new double [teller];
        for(int i=0; i<teller; i++)
            cijfer[personenTeller][i] = cijferInvoer[i];
        aantal[personenTeller] = teller;

        teller = 0; // reset teller voor volgende regel uit bestand
        personenTeller++;
        
        ifs.clear();
    }
    ifs.close();
}

//laat de cijfers van een persoon zien
void laatCijfersZien(int persoon)
{
    for(int i=0; i<aantal[persoon]; i++)
        cout << setiosflags (ios::fixed) << setw (2) << setprecision(2) << cijfer[persoon][i] << endl;
    cout << endl;
}

//geeft het gemiddelde cijfer van een persoon
double geefGemiddeldeCijfer(int persoon)
{
    int teller=0;
    double som=0;

    for(int i=0; i<aantal[persoon]; i++)
    {
        som += cijfer[persoon][teller];
        teller++;
    }
    return som/teller;
}

//geeft het aantal onvoldoendes van een persoon
int geefOnvoldoendes(int persoon)
{
    int aantalPersonen=0;

    for(int i=0; i<aantal[persoon]; i++)
        if(cijfer[persoon][i]<5.5)
            aantalPersonen++;

    return aantalPersonen;
}

//geeft de namen van de personen met minstens één onvoldoende
void geefPersonenMetOnvoldoende(void)
{
    int teller=0, gevondenAantal=0;

    for(int persoon=0; persoon<personenTeller; persoon++)
    {
        for(int i=0; i<aantal[persoon]; i++)
        {
            if(cijfer[persoon][teller]<5.5)
            {
                cout << naam[persoon] << endl;
                gevondenAantal++;
                break;
            }
            teller++;
        }
        teller=0;
    }
    cout << endl;

    if(gevondenAantal==0)
        cout << "Er zijn geen personen met onvoldoendes." << endl << endl;
    cin.ignore(100, '\n');
}

//aan gebruiker vragen welke persoon het betreft en nr. opzoeken in de array
int getPersoon(void)
{
    int persoon;
    bool found = false;

    while(!found)
    {
        cout << endl << "Voer de naam van de persoon in: ";
        char invoer[100];
        cin >> setw(100) >> invoer;
        cin.ignore(100, '\n');

        for(int i=0; i<personenTeller; i++)
        {
            if(strcmp(naam[i],invoer)==0)
            {
                persoon = i;
                found = true;
                break;
            }
        }

        if(!found)
            cout << "Ongeldige invoer !" << endl;
    }
    return persoon;
}

//geheugen vrij maken
void clear(void)
{
    //verwijderen van naam arrays
    for(int i=0; i<personenTeller; i++)
        delete [] naam[i];

    //verwijderen van cijfer arrays
    for(int j=0; j<personenTeller; j++)
        delete [] cijfer[j];
}

// menu voor de in- en uitvoer van en naar de user
void menu(void)
{
    //invoer uitlezen en bepalen wat de keuze was
    char invoer;

    do
    {
        //menu op beeld zetten
        cout << "1)  Laat de cijfers van een persoon zien" << endl;
        cout << "2)  Geef het gemiddelde cijfer van een persoon" << endl;
        cout << "3)  Geef het aantal onvoldoendes van een persoon" << endl;
        cout << "4)  Geef de namen van de personen met minstens een onvoldoende" << endl;
        cout << "0)  Einde programma" << endl << endl;

        cin.get(invoer);

        switch(invoer)
        {
            case '1':
                laatCijfersZien(getPersoon());
                break;
            case '2':
                cout << geefGemiddeldeCijfer(getPersoon()) << endl << endl;
                break;
            case '3':
                cout << geefOnvoldoendes(getPersoon()) << endl << endl;
                break;
            case '4':
                geefPersonenMetOnvoldoende();
                break;
            case '0':
                clear(); // geheugen vrij maken
                exit(EXIT_SUCCESS);
                break;
            default:
                cout << "Ongeldige invoer !" << endl;
                cin.ignore(100, '\n'); //overige invoer verwijderen
        }
    }
    while(true);
}

void main(void)
{
    //bestand inlezen
    invoer();

    //menu tonen
    menu();
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Zegt de man met de naam JavaRules.

Je mag (moet ?) officieel trouwens de headers zonder .h includen als je de namespace constructie van c++ wilt volgen.

Vraag is of je dat wilt. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

ik gebruik liever de oude library en maak geen gebruik van de namespaces... Verders heb ik echt een hekel aan c++. Dit betekend natuurlijk niet dat ik er helemaal niets vanaf weet, je zult iets toch echt moeten leren kennen voordat je kan zeggen dat je het niets vind. Dus nog steeds JavaRules !

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
B-Tree's

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Heel leuk en aardig dat hier een complete oplossing gepost werd...

Maar om nou ineens na 6 maanden behulpzaam te zijn, is ook wat vreemd. Vind je niet :?

  • flexje
  • Registratie: September 2001
  • Laatst online: 16-09 17:39

flexje

got-father

moet je dit nou als C opslaan of als c++ ???
ik vind het wazig

"Try not to become a man of success but rather to become a man of value..."


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Was me nog niet eens opgevallen zeg...hoe vind je in godsnaam zo'n post?
Zoeken naar een passend probleem bij je antwoord? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

als c++ opslaan. header files vind ik voor zo'n proggie nutteloos dus daarom bestaan die niet...

Nee ik besteed mijn 24 uur per dag niet aan het rondscheumen in forums. dus als ik mij eens in de 6 maanden verveel kom ik ff langs. Verders had ik dit toevallig gewoon nog liggen. Was ooit een nutteloze opdr. voor school... en verders, ja ik post alleen als ik een antwoord ergens op heb...
Pagina: 1