C Deel 8 (wegschrijven + weergeven)
1. Beginwoord
2. Wat gaan we doen
3. Uitleg van de toepassing
4. Een uitgewerkt voorbeeld
top
1. Beginwoord
In de vorige tutorial werd er uitgelegd hoe je gegevens moet wegschrijven naar een extern bestand.
We hebben deze gegevens ook terug op het scherm laten verschijnen.
Dit alles in 1 programma. Nu gaan we 2 programma's maken waarbij het een wegschrijft en het ander de gegevens leest.
top
2. Wat gaan we doen
Dit lijkt nu veel op elkaar trekken maar dat is het niet.
Als je de functie klakkeloos kopieert die de gegevens laat zien dan zal je een mooie error krijgen omdat er een aantal zaken niet zijn uitgevoerd.
Daarom dus deze tutorial: ik ga stap voor stap uitleggen wat je WEL moet doen.
top
3. Uitleg van de toepassing
Hoe gaat dit nu allemaal in zijn werk?
We gaan eerst onze wegschrijf functie maken, hieraan veranderd niet.
Daarna gaan we via een while loop alle gegevens lezen.
Normaal gezien zou hij nu alle gegevens lezen, ook alle gegevens waar niets inzit.
Waardoor 1) onze lay-out verpest wordt, 2) onnodige bewerkingen uitgevoerdt worden.
Daarom gaan we een variabele (in onze struct) maken die 2 waardes kan bevatten: standaard 0, en als het aangegeven wordt 1.
Deze variabele wordt mee ingelezen en we gaan kijken, zolang deze variabele verschilt van 0: blijf gegevens weergegeven, anders: stoppen.
top
4. Een uitgewerkt voorbeeld
Nu gaan we dit stap voor stap bekijken.
Eerst maken we een bestand dat gegevens wegschrijft.
#include <stdio.h>
#include <stdlib.h>
struct gegevens{
char naam[100];
int leeftijd;
}geg[100];
int i;
int leeftijd;
FILE *fp;
int gegevens_invoeren(){
printf("Geef de gegevens in
");
printf("--------------------------
");
printf("Voer 0 in bij leeftijd om te stoppen!!
");
i = 0;
fp = fopen("gegevens_sitemasters.dat", "wb");
do{
printf("Leeftijd: ");
scanf("%d", &leeftijd);
if(leeftijd != 0){
geg[i].leeftijd = leeftijd;
printf("Naam: ");
scanf("%s", &geg[i].naam);
fwrite(&geg[i], sizeof(struct gegevens), 1, fp);
i++;
}
}while(leeftijd != 0);
fclose(fp);
printf("
");
}
void main(void){
gegevens_invoeren();
}
|
Eigenlijk zou het bovenstaande moeten duidelijk zijn.
Nu gaan we een variabele aan de struct toevoegen die nul of een kan zijn: een_of_nul.
struct gegevens{
char naam[100];
int leeftijd;
int een_of_nul;
}geg[100];
|
Niets moeilijks, gewoon een variabele declareren.
En nu gaan we deze variabele een waarde geven in onze do while loop.
do{
printf("Leeftijd: ");
scanf("%d", &leeftijd);
if(leeftijd != 0){
geg[i].leeftijd = leeftijd;
printf("Naam: ");
scanf("%s", &geg[i].naam);
geg[i].een_of_nul = 1;
fwrite(&geg[i], sizeof(struct gegevens), 1, fp);
i++;
}
}while(leeftijd != 0);
|
Nog altijd niets moeilijks, maar nu komt ons tweede bestand, lezen.c!
We beginnen met de basis.
#include <stdio.h>
#include <stdlib.h>
struct gegevens{
char naam[100];
int leeftijd;
int een_of_nul;
}geg[100];
int i;
FILE *fp;
int gegevens_weergeven(){
printf("Gegevens
");
printf("--------------------------
");
fp = fopen("gegevens_sitemasters.dat", "rb");
i=-1;
do{
//weergeven van de gegevens
}while(/*voorwaarde*/);
fclose(fp);
}
void main(void){
gegevens_weergeven();
}
|
Alles nog altijd duidelijk hoop ik.
Nu gaan we via de while loop nakijken of onze bepaalde struct in zijn variabele een_of_nul de waarde 1 of 0 heeft zitten.
Maar niet van de struct waar we op dat moment mee werken, maar met de volgende.
We kijken een stapje vooruit.
Zodat als de volgende struct zijn een_of_nul variabele 0 is dan moeten we direct stoppen.
We zetten in onze do while loop:
do{
i++;
fread(&geg[i], sizeof(struct gegevens), 1, fp);
printf("%s %s %s", "naam:", geg[i].naam, "
");
printf("%s %d %s", "leeftijd:", geg[i].leeftijd, "
");
fread(&geg[i+1], sizeof(struct gegevens), 1, fp);
}while(geg[i+1].een_of_nul != 0);
|
Hier past misschien wel wat uitleg bij:
Eerst lezen we de gegevens via fread.
Daarna geven we de naam en leeftijd weer.
Vervolgens lezen we de gegevens van de volgende persoon, dit om de waarde van een_of_nul te kunnnen lezen.
Daarna kijken we in de while loop of de juist afgelezen waarde verschillend is van nul, zoja dan gaan we verder, zo neen: dan stoppen we.
Dit was het dan eigenlijk, zo ingewikkeld is het niet maar je moet er maar op komen.
Je kan het natuurlijk ook op vele andere manieren (bv. kijken of de naam leeg is of de leeftijd 0 is of iets dergelijks.
Toch denk ik dat je hier wel wat aan hebt, zodat je meerdere programma's met elkaar kan laten combineren en samenwerken.
Heb je nog vragen? Stel deze dan op het forum.
C Tutorial: Wegschrijven + weergeven in C
|