[C++] Variabele wegschrijven

Pagina: 1
Acties:

  • Servowire
  • Registratie: September 2000
  • Laatst online: 22-08 11:33

Servowire

prutser:~#

Topicstarter
Ik probeer een array van bool naar een bestandje weg te schrijven, zodat ik het later weer kan inlezen. Dit is om de "statussen" te onthouden.

Ik heb nu vanalles geprobeerd, maar de code is nu zo''n zooi geworden... ik probeer het door het om te zetten naar een string, en dan als string weggschrijven, en dan weer inlezen als string en weer omzetten.... o-m-s-l-a-c-h-t-i-g en het werkt niet eens ...

Is er een manier om simpel een variable (ook als het een array is) "binair" weg te schrijven?

met papier mache kun je alles maken!!


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:00

Robtimus

me Robtimus no like you

tis bool, dus logisch gezien een 0 (false) of 1 (true)

ben niet zo bekend meer met C++, dus ik ken niet alle details, maar volgens mij moet het zoiets zijn:
code:
1
2
3
4
5
for (int i = 0; i < "lengte van array"; ++i)
{
    if (arr[i]) "schrijf 1";
    else "schrijf 0";
}


inlezen is bijna hetzelfde

als de lengte van het array niet altijd hetzelfde is kun je die als eerste uitschrijven en dus ook inlezen...

[ Voor 21% gewijzigd door Robtimus op 22-01-2003 20:24 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Servowire
  • Registratie: September 2000
  • Laatst online: 22-08 11:33

Servowire

prutser:~#

Topicstarter
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
bool Status[9];

void SetSharedStatus()
{
    FILE * pFile;
    pFile = fopen ("status","w+");
    for (int i = 0; i < 9; i++)
    {
        fprintf(pFile, "%s", Status[i]);
        fprintf(pFile, "%s", "\n");
    }
    fclose(pFile);
}

void ReadSharedStatus()
{
    FILE * pFile;
    pFile = fopen ("status","r+");
    for (int i = 0; i < 9; i++)
    {
        fscanf(pFile, "%s", Status[i]);
    }
    fclose(pFile);
}


Dit segmentation fault bij het leven....

Update: en een test progseltje gaat ook direct op zn bek....
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include <stdio.h>

bool PinStatus[9] = { 1,1,0,1,0,1,0,1,0 };

void main(){
    FILE * pFile;
    pFile = fopen ("status","w+");
    for (int i = 0; i <= 8; i++)
    {
        if (PinStatus[i])
            {
            fprintf(pFile, "%s", "1");
            }
        if (PinStatus[i]==0)
            {
            fprintf(pFile, "%s", "0");
            }
    fclose(pFile);
    }
}


in de status file komt een "1" te staan, en hij crashed (segmentation fault)

[ Voor 103% gewijzigd door Servowire op 22-01-2003 20:46 ]

met papier mache kun je alles maken!!


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Check dan ook of je het bestand wel geopend is na fopen.

We adore chaos because we like to restore order - M.C. Escher


  • Servowire
  • Registratie: September 2000
  • Laatst online: 22-08 11:33

Servowire

prutser:~#

Topicstarter
LordLarry schreef op 22 January 2003 @ 20:32:
Check dan ook of je het bestand wel geopend is na fopen.
Daar zit het probleem niet........

met papier mache kun je alles maken!!


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 111% gewijzigd door Eelis op 18-02-2015 19:47 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42


Ipv enkel code te posten stellen we het ook op prijs als je een woordje uitleg erover doet. Zo snapt de topicstarter ook wat er gebeurt.

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
whoami schreef op 22 januari 2003 @ 20:56:
Ipv enkel code te posten stellen we het ook op prijs als je een woordje uitleg erover doet. Zo snapt de topicstarter ook wat er gebeurt.

Och ik snap heel erg goed waarom hij een std::ofstream gebruikt ipv een FILE*. Immers als je niet snapt waarom je een segfault krijgt bij zulk soort dingen, dan moet je ook niet met pointers gaan werken, maar gewoon met de std. Daar is ie immers voor bedoeld

  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 113% gewijzigd door Eelis op 18-02-2015 19:47 ]


  • Servowire
  • Registratie: September 2000
  • Laatst online: 22-08 11:33

Servowire

prutser:~#

Topicstarter
Eelis schreef op 22 januari 2003 @ 20:54:
Non-portable:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
 
int main ()
{
  bool b (true);
 
  {
    std::ofstream f ("data");
    f.write(reinterpret_cast<char const *>(&b), sizeof(bool));
  }
 
  b = false;
 
  {
    std::ifstream f ("data");
    f.read(reinterpret_cast<char *>(&b), sizeof(bool));
  }
 
  std::cout << b;
 
  return 0;
}
er komen puntjes in die "data" file....

met papier mache kun je alles maken!!


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 116% gewijzigd door Eelis op 18-02-2015 19:47 ]


Verwijderd

[quote]Servowire schreef op 22 januari 2003 @ 20:28:
[code=c++]

Update: en een test progseltje gaat ook direct op zn bek....
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include <stdio.h>

bool PinStatus[9] = { 1,1,0,1,0,1,0,1,0 };

void main(){
    FILE * pFile;
    pFile = fopen ("status","w+");
    for (int i = 0; i <= 8; i++)
    {
        if (PinStatus[i])
            {
            fprintf(pFile, "%s", "1");
            }
        if (PinStatus[i]==0)
            {
            fprintf(pFile, "%s", "0");
            }
    fclose(pFile);    <---  CRASH
    }
}


Je hebt je fclose binnen je loop, dat gaat natuurlijk nooit werken

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:19

Klippy

Still Game

Kan je niet beter gewoon een INI file gebruiken in dit geval?

Met een key van 0/1 of TRUE/FALSE?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Servowire
  • Registratie: September 2000
  • Laatst online: 22-08 11:33

Servowire

prutser:~#

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
bool PinStatus[9] = { 0,0,0,0,0,0,0,0,0 };

void ReadSharedStatus()
{
    std::ifstream f ("data");
    for (int i=0; i > 9; i++)    
    {
    f.read(reinterpret_cast<char *>(&PinStatus[i]), sizeof(bool));
    }
}



Dit werkt niet...

[ Voor 8% gewijzigd door Servowire op 22-01-2003 21:35 ]

met papier mache kun je alles maken!!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:18

.oisyn

Moderator Devschuur®

Demotivational Speaker

open je bestand eens als binary :)
(en natuurlijk ook wegschrijven als binary)

.edit: en voor je gaat vragen hoe dat moet: druk eens op f1 oid ;)

[ Voor 82% gewijzigd door .oisyn op 22-01-2003 21:47 ]

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.


  • barber
  • Registratie: Oktober 2001
  • Niet online
Servowire schreef op 22 januari 2003 @ 21:33:
C++:
1
2
3
4
5
6
7
8
9
10
bool PinStatus[9] = { 0,0,0,0,0,0,0,0,0 };

void ReadSharedStatus()
{
    std::ifstream f ("data");
    for (int i=0; i > 9; i++)    
    {
    f.read(reinterpret_cast<char *>(&PinStatus[i]), sizeof(bool));
    }
}



Dit werkt niet...
En als je nu eens i<9 doet i.p.v. i>9 in die for statement

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
std::bitset al bekeken? Die is speciaal voor fixed-size arrays van bitjes, en heeft een operator<< en operator>> (niet binair, strings van 0|1, maar gezien je commentaar over de puntjes? )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1