[c] werken met fwrite/fread

Pagina: 1
Acties:

  • Diadem
  • Registratie: Maart 2000
  • Laatst online: 31-05-2023
Ik ben in c aan het proberen een behoorlijk grote struct naar een bestand weg te schrijven. Deze struct bevat char[], ints en double's.

Nu heeft c daar een optie voor, namelijk fwrite.

size_t fwrite(void *ptr, size_t size, size_t nobj, FILE *stream)

Waarna je ze weer kunt inlezen met het identiek werkende fread.

Maar dat gaat helemaal mis bij mij. Ik dacht eerst dat het lag aan struct alignment, maar ik heb de struct nu zo gemaakt dat ie precies 392 bytes is, dus dat er niet gealignt wordt omdat alles al goed staat. En het werkt nog steeds niet.

Ik heb een array van 12 keer deze struct. Het rare is dat in het bestand het eerste element dus 394 bytes inneemt, en de tweede 392 en de derde 395. Een beetje vreemd dus.

Ik zal een stukje code geven:

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
35
36
37
38
typedef struct
{
    char naam[96];
    int dnet_id;
    int seti_id;
    int sob_id;
    int ecc2_id;
    int tsc_id;
    int d2ol_id;
    int ptotr[9];
    int phuir[9];
    double ptot[9];
    double phui[9];
    double hui;
    double tot;
    double dnet;
    double seti;
    double others;
    double index;
    int others_id;
    int extra;
} teamtype;

teamtype team[12];

void fwriteteam()
{
    FILE *fp=fopen("test.dat", "w");
    fwrite(team, sizeof(teamtype), 12, fp);
    fclose(fp);
}

void freadteam()
{
    FILE *fp=fopen("test.dat", "r");
    fread(team, sizeof(teamtype), 12, fp);
    fclose(fp);
}


Weet iemand wat hier mis gaat? Of weet iemand misschien een andere methode om de hele struct netjes naar een bestand te krijgen.

[ Voor 10% gewijzigd door Diadem op 02-02-2003 17:43 ]

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett


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

drm

f0pc0dert

Zit je heel toevallig op een windows-systeem te werken, of niet? In dat geval is het wellicht handig aan te geven dat je in binary mode aan 't lezen/schrijven bent. Tweede argument van fopen moet dan resp. "wb" en "rb" zijn.

offtopic:
Overigens is het misschien niet gek 1x het bestand te openen, en de FILE pointer aan de 2 write en read functies mee te geven? openen en sluiten van bestanden kost relatief veel tijd, nl, nog afgezien van het feit dat je "test.dat" nu hard gecodeerd is (2x ;))

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

als je m nou eens schrijft als binary ipv text

.edit: spuit 11 :P

[ Voor 20% gewijzigd door .oisyn op 02-02-2003 18:52 ]

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.


  • Diadem
  • Registratie: Maart 2000
  • Laatst online: 31-05-2023
Thanks! Nu werkt het idd

Nooit geweten dat c dat standaard verkeerd doet. Heel irritant, dat windows niet standaard binaries gebruikt. ftp'en gaat ook altijd standaard verkeerd.

Nouja, problem solved.
drm schreef op 02 februari 2003 @ 18:50:

offtopic:
Overigens is het misschien niet gek 1x het bestand te openen, en de FILE pointer aan de 2 write en read functies mee te geven? openen en sluiten van bestanden kost relatief veel tijd, nl, nog afgezien van het feit dat je "test.dat" nu hard gecodeerd is (2x ;))
Snelheid is niet echt een issue. 99.9% van de runtime gaat zitten in het ophalen van bestanden van internet. Die overige 0.01% boeit weinig.

Bovendien is het natuurlijk de bedoeling dat ie normaal niet wegschrijft en inleest tegelijk. Dat is namelijk weinig nuttig natuurlijk ;)

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett


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

drm

f0pc0dert

Snelheid is niet echt een issue. 99.9% van de runtime gaat zitten in het ophalen van bestanden van internet. Die overige 0.01% boeit weinig.
Het kan nooit kwaad in de meest kleine dingetjes toch je code zo netjes mogelijk te schrijven. De volgende keer denk je er misschien niet aan en doe je 't automatisch verkeerd.
Bovendien is het natuurlijk de bedoeling dat ie normaal niet wegschrijft en inleest tegelijk. Dat is namelijk weinig nuttig natuurlijk
Je bedoelt dat 't programma of inleest, of wegschrijft tijdens zijn hele runtime?

offtopic:
Overigens heb ik het altijd al vreemd gevonden dat windows (en dos) onderscheid maakt tussen ascii en binary bestanden, puur omdat een newline character 2 bytes beslaat :|

[ Voor 15% gewijzigd door drm op 02-02-2003 20:27 ]

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Diadem schreef op 02 February 2003 @ 20:01:
Thanks! Nu werkt het idd

Nooit geweten dat c dat standaard verkeerd doet. Heel irritant, dat windows niet standaard binaries gebruikt. ftp'en gaat ook altijd standaard verkeerd.


standaard verkeerd? Files worden standaard geopend als tekst in en output. Dat staat in de documentatie. Als je een bestand als binary wil openen (wat minder gebruikelijk is) dan zul je dat erbij moeten zeggen, heel logisch

En het is niet windows die dat doet, maar dat staat in de ANSI C standaard :)

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

Diadem schreef op 02 February 2003 @ 20:01:Snelheid is niet echt een issue. 99.9% van de runtime gaat zitten in het ophalen van bestanden van internet. Die overige 0.01% boeit weinig.
offtopic:
Flauw: en die overige 0,09% dan? :+

  • Diadem
  • Registratie: Maart 2000
  • Laatst online: 31-05-2023
drm schreef op 02 February 2003 @ 20:26:
[...]

Het kan nooit kwaad in de meest kleine dingetjes toch je code zo netjes mogelijk te schrijven. De volgende keer denk je er misschien niet aan en doe je 't automatisch verkeerd.

[...]
Je bedoelt dat 't programma of inleest, of wegschrijft tijdens zijn hele runtime?
Het programma schrijft alleen weg tijdens zijn hele runtime. Het is bedoeld als archief. De read optie had ik alleen gebouwd om te testen of ik het uberhaupt nog terug kon krijgen. Nu dat werkt hoef ik hem niet meer te gebruiken. Nouja, niet in dit programma, wel in een ander ;)

Het programma opent tijdens zijn runtime 57 verschillende bestanden. En slechts eentje daarvan meerdere keren. Je hebt gelijk dat ik dat misschien zou moeten aanpassen. Maar echt uitmaken gaat het niet denk ik ;)

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett


  • Diadem
  • Registratie: Maart 2000
  • Laatst online: 31-05-2023
Verwijderd schreef op 02 February 2003 @ 20:29:
[...]
offtopic:
Flauw: en die overige 0,09% dan? :+
Die wordt besteed aan het naar het scherm schrijven van allerlei zinloze getalletjes die ik echter als devvers wel extreem handig vind ;)

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett

Pagina: 1