Toon posts:

[C++] binair wegschrijven

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben aan het proberen om wat data binair weg te schrijven en aan elkaar te plakken, een soort van data-packager maken. Nu loop ik tegen het volgende probleem aan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
#include <iostream>

using namespace std;

struct testStructure {
    char szTekst[10];
};

int main() {
    testStructure myTest;
    strcpy(myTest.szTekst, "Hallo");

    FILE *fp = fopen("data.txt", "wb");
    fwrite(&myTest, sizeof(testStructure), 1, fp);

    return 0;
}


Nu krijg ik als output in data.txt:
慈汬o쳌쳌

Het gaat dus niet helemaal goed, ook als ik netjes weer de data in dezelfde structure inlees krijg ik mijn data niet terug.
Als ik sizeof(testStructure) verander, naar bijv. 30 en heel robuust alles wegschrijven zie ik wel op de eerste regel 'Hallo' verschijnen.

Hoe moet ik het voor elkaar krijgen om de structure gewoon normaal weg te schrijven?

Peter.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Vaag, je code ziet er verder wel goed uit... Wat geeft je compiler als waarde voor sizeof(testStructure) (en welke compiler gebruik je eigenlijk?)

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

Topicstarter
Ik maak gebruik van MVC++ 6.0 en die geeft aan dat sizeof(testStructure) gewoon 10 is.

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 23-02 08:04

leuk_he

1. Controleer de kabel!

fclose of exit gebruiken?

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Verwijderd

Topicstarter
Sorry, dat was ik vergeten. Ook met fclose(fp) krijg ik dezelfde output.

  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Waarmee lees je het gegenereerde bestand uit? Binnen je eigen programma?

En staat er nog meer in die struct, voor die tekenreeks? Je geeft namelijk de tekenreeks een waarde maar gaat daarna de hele struct weg schrijven, misschien ben je wel over de grootte van de tekenreeks heen gegaan die je ervoor in de struct declareerde...

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
[b][message=25506016,noline]E-Coder schreef op maandag 03 april 2006 @ Nu krijg ik als output in data.txt:
慈汬o쳌쳌
Misschien verschaft een hex viewer meer duidelijkheid.

  • W4rlock
  • Registratie: Februari 2002
  • Laatst online: 04-12-2014
Je schrijft in het voorbeeld niet de gehele byte array vol, de rest van de data is dus random garbage, vandaar dat het er zo raar uit ziet, je schrijft immers wel alle data naar de file.

Notepad is brak dus laat misschien niet de eerste tekens zien door de random binaire garbage :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Technisch gesproken lees je ongeinitialiseerde data (na de \0) en dat is undefined behavior. Het verbaast me dat het fout gaat, maar er zit dus een bug in je programma.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hmm, ik ging er eigenlijk vanuit dat je de data niet met notepad bekeek, dat is natuurlijk vragen om moeilijkheden. Je schrijft niet voor niets als binary weg :). Werkt het eigenlijk wel als je het bestand op dezelfde manier weer inleest (maw, is er wel een probleem of lijkt dat alleen maar zo?)

[ Voor 11% gewijzigd door .oisyn op 03-04-2006 21:43 ]

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.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Als er backspaces oid staan in dat stukje random geheugen kan dit goed. En waarom niet.

Verwijderd

Topicstarter
Ik schaam me diep . Dit blijkt dus wel gewoon goed te werken. Ik had gedacht dat de tekst nog zichtbaar zou zijn in notepad :+.

Ik ben nu aan het sleutelen aan m'n hoofdprogramma, het moet ergens anders fout zitten. Maar met wat debuggen kom ik er wel uit.

Bedankt :).

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op maandag 03 april 2006 @ 22:58:
Ik schaam me diep . Dit blijkt dus wel gewoon goed te werken. Ik had gedacht dat de tekst nog zichtbaar zou zijn in notepad :+.
Zo te zien denkt notepad dat het Unicode is.

Verwijderd

Topicstarter
Sorry, het wil toch niet helemaal lukken. Ik heb het voorbeeldje nu een beetje aangepast, nu ziet het er zo uit:

code:
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
#include <cstdio>
#include <iostream>

using namespace std;

struct testStructure {
    char *szTekst;
};

int main() {
    testStructure myTest;
    myTest.szTekst = new char[10];
    strcpy(myTest.szTekst, "Hallo");

    FILE *fp = fopen("data.txt", "wb");
    fwrite(&myTest, 10, 1, fp);

    delete[] myTest.szTekst;
    fclose(fp);

    testStructure readTest;
    fp = fopen("data.txt", "rb");
    readTest.szTekst = new char[10];
    fread(&readTest, 10, 1, fp);
    cout << readTest.szTekst << endl;
    delete[] readTest.szTekst;
    fclose(fp); 

    return 0;
}


Nu komen er dus alleen een boel vage tekens uit, misschien komt dit omdat het gereserveerde geheugen ergens anders staat, en dus niet in de structure zelf. Maar is hier een oplossing voor? Want ik zou graag gebruik willen maken van een char-pointer.

Alvast bedankt :).

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Verwijderd schreef op dinsdag 04 april 2006 @ 08:38:
Sorry, het wil toch niet helemaal lukken. Ik heb het voorbeeldje nu een beetje aangepast, nu ziet het er zo uit:

code:
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
#include <cstdio>
#include <iostream>

using namespace std;

struct testStructure {
    char *szTekst;
};

int main() {
    testStructure myTest;
    myTest.szTekst = new char[10];
    strcpy(myTest.szTekst, "Hallo");

    FILE *fp = fopen("data.txt", "wb");
    fwrite(&myTest, 10, 1, fp);

    delete[] myTest.szTekst;
    fclose(fp);

    testStructure readTest;
    fp = fopen("data.txt", "rb");
    readTest.szTekst = new char[10];
    fread(&readTest, 10, 1, fp);
    cout << readTest.szTekst << endl;
    delete[] readTest.szTekst;
    fclose(fp); 

    return 0;
}


Nu komen er dus alleen een boel vage tekens uit, misschien komt dit omdat het gereserveerde geheugen ergens anders staat, en dus niet in de structure zelf. Maar is hier een oplossing voor? Want ik zou graag gebruik willen maken van een char-pointer.

Alvast bedankt :).
je schrijft de pointer naar het bestand...

en die pointer lees je dan in opnieuw in.

met die delete's ertussen verwondert het me dat je't zomaar kan (tijdens debug build)

[ Voor 23% gewijzigd door H!GHGuY op 04-04-2006 09:09 ]

ASSUME makes an ASS out of U and ME


  • grizzlybear
  • Registratie: Oktober 2001
  • Laatst online: 14-02 13:30
Je moet niet het adres van myTest gebruiken, maar het adres van myTest[0]

dus niet

&myTest, maar &myText[0]

Verwijderd

Topicstarter
//edit : grizzlybear heeft al gereageerd om mijn vraag.

Ik ga het even proberen :).

[ Voor 72% gewijzigd door Verwijderd op 04-04-2006 09:15 ]


Verwijderd

Topicstarter
Stom van me dat ik de pointer weg schreef... op deze manier werkt het wel:

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
#include <cstdio>
#include <iostream>

using namespace std;

struct testStructure {
    char *szTekst;
};

int main() {
    testStructure myTest;
    myTest.szTekst = new char[10];
    strcpy(myTest.szTekst, "Hallo");

    FILE *fp = fopen("data.txt", "wb");
    fwrite(myTest.szTekst, 10, 1, fp);

    delete[] myTest.szTekst;
    fclose(fp);

    testStructure readTest;
    fp = fopen("data.txt", "rb");
    readTest.szTekst = new char[10];
    fread(readTest.szTekst, 10, 1, fp);
    cout << readTest.szTekst << endl;
    delete[] readTest.szTekst;
    fclose(fp); 

    return 0;
}


Maar het kan dus niet anders dan dat je de tekst appart wegschrijft/inleest?

[ Voor 8% gewijzigd door Verwijderd op 04-04-2006 09:31 ]


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Wat wil je dan precies?

Die new/delete heeft eigenlijk ook niet zo veel zin. Als je het echt dynamisch wilt maken en de lengte variable kan je beter eerst de lengte wegschrijven van je szTekst, die dan inlezen, aan de hand hiervan je buffer aanmaken en dan de data inlezen.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Verwijderd

Topicstarter
Dit doe ik ook in mijn hoofdprogramma. Ik ga nu in mijn hoofdprogramma alles appart wegschrijven, dus de naam van de file, data, enz. En deze allemaal apart in lezen in een structure. Wat ik eerst had gedaan is dat ik de grote van de buffers wegschreef en hierna de structure zelf. Maar dat kan dus niet omdat ik dan met die pointers zit.

Ik laat nog horen als het gelukt is...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:53
Als je struct een P(lain) O(ld) D(atatype) blijft ( dwz geen virtuele functies e.d. ) , kun je ook het hele array in een keer wegschrijven. Werkt alleen maar als je fixed sized arrays hebt. :)

bv:
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
struct pod
{
    char dta[ 256 ];
};

pod mypod[256] = { 0 };
pod mypod2[256] = { 0 };

void main( void )
{
    // testvalues
    for( int i = 0; i < 256; ++i )
        mypod[i].dta[0] = i;

    FILE *fp = fopen("./data.txt", "wb");
    fwrite(  (const void*)mypod, sizeof( pod ), 256, fp );
    fclose(fp);

    fp = fopen("./data.txt", "rb");
    fread( mypod2, sizeof( pod ), 256, fp);
    fclose(fp); 

    std::cin.get();
}

[ Voor 56% gewijzigd door farlane op 04-04-2006 10:58 ]

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.


Verwijderd

Topicstarter
Ja, dat doe ik in mijn eerste voorbeeld ook. Maar in mijn programma ga ik toch alles appart inlezen/wegschrijven omdat ik geen gebruik kan maken van fixed-arrays.

Bedankt :).
Pagina: 1