Archief - [c]bin file inlezen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

matx5

Legacy Member
Ik zou een binair bestand moeten inlezen zodat ik via een struct deze gegevens kan gebruiken in een andere functie. Maar dit wil niet lukken. Wanneer ik dit uitvoer krijg ik een hoop rommel op het scherm dat nog in het geheugen zat. Weet iemand wat ik over het hoofd zie?
Alvast bedankt!

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
  int dag;
  int maand;
  int jaar;
}DATUM;
typedef struct{
  char naam[20];
  DATUM gebdat;
  char geslacht;
  int isVerzonden ;
}PERSOON;

int inlezen(PERSOON*);
void toonGegevens(PERSOON*, int);



int main (void){
  int aantal;
  PERSOON personen[20];

  aantal=inlezen(personen);
  printf("Overzicht\n");
 toonGegevens(personen,aantal);
  return 0;
}

int inlezen(PERSOON personen[]){
	FILE *f;
	int aantal=0;
	f = fopen("vriend.bin", "rb");
	while(fread(&personen, sizeof(PERSOON),1,f) == 1)
	{
	aantal++;
	}
	fclose(f);
  return aantal;
}

void toonGegevens(PERSOON personen[], int aantal)
{
  int i;
  char maand[12][10]={"januari","februari","maart","april","mei",
  "juni","juli","augustus","september","oktober","november","december"};
  //toon alle gegevens, zorg voor een mooie layout
  for(i=0;i<aantal;i++){
  printf("%20s\t%2d\t%2d\t%4d\t%c\t%d\n", personen[i].naam,personen[i].gebdat.dag,personen[i].gebdat.maand,personen[i].gebdat.jaar,personen[i].geslacht,personen[i].isVerzonden);
  }

}

Daedie

Legacy Member
ge leest uit uit uw file een aantal keer 1 chunk met de grootte van 1 PERSOON-struct in een array van 20 structs, maar wel naar hetzelfde adres (begin van de array) . Daar zal al zeker "een" probleem zitten.

edit: ook is de variabele "personen" al een pointer op zich (pointer naar begin van de array dus). &personen is dus een pointer naar een pointer. Kan ook niet goed zijn.

matx5

Legacy Member
Je had gelijk, alles werd opgeslagen in personen[0]. Ik heb dit zo opgelost:
Code:
while(fread(&personen[aantal], sizeof(PERSOON),1,f) == 1){
	aantal++;
	}
Is dit een degelijke oplossing?

Daedie

Legacy Member
Dat was ook min of meer hetgeen dat ik wou voorstellen. Maar wou u eerst ff zelf laten zoeken met mijn "tips" ^^.

edit: let ook wel op dat ge op deze manier uit de boundaries van uw array zult lopen indien ge meer dan 20 structs in uw file hebt steke. Ik weet niet juist wat de opdracht of het project is, maar afhankelijk van hetgeen ge er nog mee wilt doen kan het nuttiger zijn om een dynamische structuur te voorzien (Een structuur die meegroeit naarmate ge meer informatie inleest). Maar als het een simpel oefeningske is, is dat niet echt nodig ofc :).

Tyfius

Legacy Member
HC_Daedalus zei:
Dedit: let ook wel op dat ge op deze manier uit de boundaries van uw array zult lopen indien ge meer dan 20 structs in uw file hebt steke. Ik weet niet juist wat de opdracht of het project is, maar afhankelijk van hetgeen ge er nog mee wilt doen kan het nuttiger zijn om een dynamische structuur te voorzien (Een structuur die meegroeit naarmate ge meer informatie inleest). Maar als het een simpel oefeningske is, is dat niet echt nodig ofc :).
Een andere manier (die minder geheugen zal verbruiken, en als de opdracht het toelaat) is om telkens 1 blok uit te lezen en de inhoud meteen af te drukken.

Om uw ganse array PERSONEN op 0 te initializeren (en dus alle overbodige geheugen gibberisch eruit te halen) kan je misschien een memset() overwegen.
Code:
memset(personen, 0, sizeof(PERSOON) * 20);

Daarnaast nog enkele tips:
  • typedef's en structs worden normaal niet met hoofdletters geschreven
  • spaties tussen uw '=', ',', '){'... tekens kunnen nooit kwaad
  • consistentie in de positionering van uw '{' tekens is beter
  • indentering (al zal dat meer te maken hebben met dit forum veronderstel ik)
Neem dit niet verkeerd op, maar ik weet uit ervaring dat het als docent toffer is op propere en duidelijke code voor mijn neus te krijgen dan code die zomaar op een hoopje achter elkaar werd gegoten. Hij of zij zal er u waarschijnlijk wel dankbaar voor zijn. :)

Daedie

Legacy Member
Tyfius zei:
Een andere manier (die minder geheugen zal verbruiken, en als de opdracht het toelaat) is om telkens 1 blok uit te lezen en de inhoud meteen af te drukken.

Om uw ganse array PERSONEN op 0 te initializeren (en dus alle overbodige geheugen gibberisch eruit te halen) kan je misschien een memset() overwegen.
Code:
memset(personen, 0, sizeof(PERSOON) * 20);

Dat klopt inderdaad in het geval ge enkel wilt afdrukken. Maar aangezien hij de moeite deed om er een structuur voor aan te leggen was ik er zo'n beetje van uitgegaan dat hij graag een lijst wou bijhouden van hetgeen hij inleest (en dat dit programmatje eigenlijk een testprogrammatje is voor een deelprogramma in een groter geheel).

matx5

Legacy Member
Het is een klein stukje uit mijn grote oefening ter voorbereiding van m'n 2de zit vrijdag :)
Het was dus idd de opgave om eerst alles in te lezen en dan met een andere functie een afdruk te maken.
Daarnaast nog enkele tips:

* typedef's en structs worden normaal niet met hoofdletters geschreven
* spaties tussen uw '=', ',', '){'... tekens kunnen nooit kwaad
* consistentie in de positionering van uw '{' tekens is beter
* indentering (al zal dat meer te maken hebben met dit forum veronderstel ik)

Neem dit niet verkeerd op, maar ik weet uit ervaring dat het als docent toffer is op propere en duidelijke code voor mijn neus te krijgen dan code die zomaar op een hoopje achter elkaar werd gegoten. Hij of zij zal er u waarschijnlijk wel dankbaar voor zijn.
Ik ga er proberen op te letten, bedankt voor de tips :)
Alleen zijn wij wel verplicht om structs in hoofdletters te schrijven.
Bedankt voor de hulp allebei, ik hoop dat ik er verder uit raak nu :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan