[c] Struct wegschrijven naar binair bestand.

Pagina: 1
Acties:

  • Cai
  • Registratie: December 2001
  • Laatst online: 21:58
Ik heb voor school een eindopdracht, waaronder ik structs moet wegschrijven. Ik kan alleen niet vinden in m'n boek hoe(Dennis Ritchie C handboek).

Zou iemand me kunnen helpen hiermee.

stel ik heb een volgend struct:
code:
1
2
3
4
typedef struct{
int a;
int b;
}VOORBEELD;

Hoe schrijf ik deze weg in 't bestand data.dat.

Als iemand me zou kunnen helpen graag.

Mvg,
Daan

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Je kan de grootte van een struct bepalen door middel van de sizeof() taalconstructie.

Verder kan je een pointer naar een struct eigenlijk zien als een pointer naar een geheugengebied van sizeof(...jouw struct...) bytes.

En dan kan je een gewone fwrite() doen ofzo.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Cai
  • Registratie: December 2001
  • Laatst online: 21:58
Dat pointer gedeelte begrijp ik, dat ruimte reserveren mbv malloc(sizeof(VOORBEELD)) in dit geval begrijp ik ook.

Maar wat me niet lukt is om met fwrite die struct in 1x weg te schrijven. Wat is het % voor een struct weg te schrijven zoals %d voor een int is.

Of zit ik nu in de verkeerde richting?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Of zit ik nu in de verkeerde richting?
Ik ben bang van wel... ik bedoel, tekst en binaire data door elkaar gooien lijkt me niet zo verstandig.

Eerst iets: fwrite != fprintf.
Aangezien je het over % dingetjes hebt, bedoel jij waarschijnlijk de laatste.

fprintf kan je hiervoor niet gebruiken, want wat fprintf doen is het maken van een tekstuele representatie van het datatype. En van jouw datatype, "VOORBEELD", kan fprintf niet zomaar een stuk tekst maken (dat zijn counterpart fscanf weer in kan lezen).

Vertel bovendien eens wat meer over je opdracht en het bestandsformaat, want anders kan er eigenlijk geen advies gegeven worden.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

tenzij je het echt in tekstformaat wil opslaan... dan zul je ze member voor member moeten wegschrijven, met daartussen een speciaal teken zodat je kan herkennen wat bij wat hoort (bijvoorbeeld gewoon de ',')

voorbeeld:
code:
1
2
3
4
void fprintVoorbeeld (FILE * file, const VOORBEELD * vb)
{
    fprintf (file, "%i,%i\n", vb->a, vb->b);
}

.offtopic:
Mvg,
Daan
groeten onder de posts hebben we liever niet :)
uit de FAQ:
Wij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz [user]" of iets dergelijks onder je post te plakken. Als je perse zoiets wilt kun je daar je signature voor gebruiken (zie latere uitleg).

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

Op maandag 27 mei 2002 23:15 schreef Cai het volgende:
Dat pointer gedeelte begrijp ik, dat ruimte reserveren mbv malloc(sizeof(VOORBEELD)) in dit geval begrijp ik ook.

Maar wat me niet lukt is om met fwrite die struct in 1x weg te schrijven. Wat is het % voor een struct weg te schrijven zoals %d voor een int is.

Of zit ik nu in de verkeerde richting?
post is je stukje code en de foutmeldingen van compilen / runnen die je krijgt, kunnen we meer mee
(ik moet dit straks ook zelf kunnen toepassen)

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Op maandag 27 mei 2002 23:10 schreef Cai het volgende:
Zou iemand me kunnen helpen hiermee.

stel ik heb een volgend struct:
code:
1
2
3
4
typedef struct{
int a;
int b;
}VOORBEELD;

Hoe schrijf ik deze weg in 't bestand data.dat.
Zonder error checking of andere vorm van intelligentie :

VOORBEELD blaat;

fd = open("data.dat", O_RDWR | O_CREAT | O_EXCL, 0644);
lseek(fd, 0, SEEK_SET);
write(fd, &blaat, sizeof(VOORBEELD));

edit:
De open() onder DOS en Windhoos heeft geloof ik O_BINARY nodig

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
.oisyn: tenzij je het echt in tekstformaat wil opslaan... dan zul je ze member voor member moeten wegschrijven, met daartussen een speciaal teken zodat je kan herkennen wat bij wat hoort (bijvoorbeeld gewoon de ',')
Als je dan toch je data gaat structureren kan je net zo goed gelijk een abstract data type als XML of ATermen pakken. Als je een goede XML lib kan vinden voor C is het eenvoudig om een structuur op te bouwen en de serializatie is al voor je geimplementeerd in de lib (waarschijnlijk).

Met ATermen is het eigenlijk nog makkelijker omdat daar een uitstekende C library voor is. Daarnaast is het opslagformaat ook uitermate efficient.

Je hoeft je in beide gevallen niet meer druk te maken om serializatie details, maar je houdt je puur bezig met het mappen van structs naar de universele structuur van XML of ATermen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

mbravenboer: stfu ;)

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.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
.oisyn: stfu ;)
In de betekenis van:
1. Sir, That's Freakin' Ugly? ;)
2. Slashdot Trolls Feign Understanding? ;)

wtf?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

doe die eerste maar, die past wel goed bij wat jij schreef *D

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

Uhm, geachte mede proggers, zullen we even gewoon ANSI C gebruiken: dus fopen inplaats van open. Dan weet je tenminste zeker dat je niet afhankelijk bent van je compiler!
En vervolgens gebruik je bijvoorbeeld fwrite om je struct weer weg te schrijven. Even een voorbeeldje uit de Borland builder 5 help file:

#include <stdio.h>

struct mystruct
{
int i;
char ch;
};

int main(void)
{
FILE *stream;
struct mystruct s;

if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
s.i = 0;
s.ch = 'A';
fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */
fclose(stream); /* close file */
return 0;
}

Het uitlezen doe je dan weer met fread.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:50
Op dinsdag 28 mei 2002 14:57 schreef Vlad het volgende:
Uhm, geachte mede proggers, zullen we even gewoon ANSI C gebruiken: dus fopen inplaats van open. Dan weet je tenminste zeker dat je niet afhankelijk bent van je compiler!
En vervolgens gebruik je bijvoorbeeld fwrite om je struct weer weg te schrijven.
Dit is naar mijn mening ook de enige echte juiste manier. De andere suggesties mag je vergeten. Volgende keer de code wel tussen [code]-tags, alsjeblieft.

Verwijderd

Euh, tja, ben nog een beetje nieuw hiero, met dat getag ben ik dus nog niet zo bekend...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Soultaker: De andere suggesties mag je vergeten.
En bedankt :( ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Vlad:
Euh, tja, ben nog een beetje nieuw hiero, met dat getag ben ik dus nog niet zo bekend...
RTFF ;)
Vlad:
Uhm, geachte mede proggers, zullen we even gewoon ANSI C gebruiken: dus fopen inplaats van open. Dan weet je tenminste zeker dat je niet afhankelijk bent van je compiler!
Als dat het enige is waar je rekening moet houden om cross-compiler C te proggen :D ;)

maar idd, open () = :r
mbravenboer:
En bedankt :( ;)
Ik vind XML ook een goede oplossing, hoor :* Wat betreft ATermen: *click*

edit:
is zeker niet oninteressant :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Cai
  • Registratie: December 2001
  • Laatst online: 21:58
[oftopic]
Vlad dat is wat ik zocht, bedankt
[/oftopic]

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Uhm, geachte mede proggers, zullen we even gewoon ANSI C gebruiken: dus fopen inplaats van open. Dan weet je tenminste zeker dat je niet afhankelijk bent van je compiler!
Een OS wat open() niet snapt moet ik nog tegenkomen (aangezien fopen ook open() gebruikt), maar dit terzijde. Het ging om het idee, niet om de letterlijke implementatie (die had de poster ook wel uit het open() voorbeeld kunnen halen)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Cai:
[oftopic]
Vlad dat is wat ik zocht, bedankt
[/oftopic]
da's toch ontopic :? ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
Op dinsdag 28 mei 2002 13:22 schreef mbravenboer het volgende:

In de betekenis van:
1. Sir, That's Freakin' Ugly? ;)
2. Slashdot Trolls Feign Understanding? ;)

wtf?
Loooool, deze vink grappig:
Say, That's Fairly Unusual

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.

Pagina: 1