[C++] fwrite misvormt de string die geschreven moet worden

Pagina: 1
Acties:

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Aangezien m'n C++ boek me niet kon helpen, verwacht ik dat jullie dat wel kunnen :)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;

int main( int argc, char *argv[] )
{
    // Define input vars
    string card[9];
    
    // Ask user to input
    cout << "Type of card? ( eg. Monster )\n";
    cin >> card[0];
    cout << "\nFilename of card image? ( eg. Monster.bmp )\n";
    cin >> card[1];
    cout << "\nName of the card? ( eg. Blue Eyes White Dragon )\n";
    cin >> card[2];
    cout << "\nWhat is the type of the card? ( eg. Dark )\n";
    cin >> card[3];
    cout << "\nWhat is the card's amount of stars? ( eg. 7 )\n";
    cin >> card[4];
    cout << "\nWhat is the cards description? ( eg. ultimate wizard in terms of attack and defence )\n";
    cin >> card[5];
    cout << "\nWhat is the cards effect? ( eg. Flip: destroy one faced up monster on the field )\n";
    cin >> card[6];
    cout << "\nHow many attack points has the card? ( eg. 1500 )\n";
    cin >> card[7];
    cout << "\nHow many defense points has the card? ( eg. 1200 )\n";
    cin >> card[8];
    cout << "\n";
    
    FILE *fp;
    if( ( fp = fopen( "carddatabase.xml", "a+" ) ) == NULL )
    {
        cout << "Cannot open file!" << endl;
        return 1;
    }
    
    string input;
    input = "<card type=\"" + card[0] + "\" src=\"" + card[1] + "\">" + "\n";
    input += "<name>" + card[2] + "</name>" + "\n";
    input += "<type>" + card[3] + "</type>" + "\n";
    input += "<level>" + card[4] + "</level>" + "\n";
    input += "<description>" + card[5] + "</description>" + "\n";
    input += "<effect>" + card[6] + "</effect>" + "\n";
    input += "<attack>" + card[7] + "</attack>" + "\n";
    input += "<defense>" + card[8] + "</defense>" + "\n";
    input += "</card>\n";
     
    cout << input; 
      
    fwrite( &input, sizeof( input ), sizeof( input ), fp );
    
    fclose( fp );
    
    cout << "Wrote to file!" << endl;
    system( "pause" );
    return 0;
}


Ja, input heeft de juiste waarde ( voorbeeld door programma uitgespuugd ) :
XML:
1
2
3
4
5
6
7
8
9
<card type="Monster" src="M.bmp">
<name>BEWD</name>
<type>Dark</type>
<level>7</level>
<description>None</description>
<effect>Blaat</effect>
<attack>2100</attack>
<defense>1200</defense>
</card>


Maar in het xml bestand staat:
code:
1
2
3
4
5
6
T<=
ã¿w



¹7=


Wat is het probleem? :?

  • twanvl
  • Registratie: Februari 2005
  • Laatst online: 10-11-2025
de twee grootte argumenten van fwrite moeten niet hetzelfde zijn, het is grootte van 1 record en het aantal records. Zet een van de twee dus op 1.
Verder moet je de string omzetten naar een C string met .c_str(), ik snap niet dat je compiler hier niet over gezeurt heeft.
Trouwens, de string header is <string>, niet <cstring>.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
De fout zit 'm in deze regel:
C++:
52
fwrite( &input, sizeof( input ), sizeof( input ), fp );

Hoe kom je erbij dat de inhoud van de string op het geheugenadres van input zou moeten staan? Dat is natuurlijk niet zo, net zoals de lengte van de string niets te maken heeft met de grootte van het string-object zelf.

Je kunt het op twee manieren oplossen; ofwel je gebruikt een string-methode om een pointer naar de data en de lengte daarvan te krijgen (en die heten, logisch genoeg, data en size), ofwel je gebruikt C++ I/O streams in plaats van C-style I/O.

Verder nog een style-issue om over na te denken; je bouwt nu op een vrij kostbare manier (door steeds te concateneren) een string op, die je vervolgens in het geheel wegschrijft. Is het niet veel logischer om de stukken die je nu concateneert gewoon achter elkaar weg te schrijven?

[ Voor 18% gewijzigd door Soultaker op 13-04-2005 20:20 ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Het dringt niet tot me door.
Ik heb iig de header verandert;
de fwrite regel verandert; ( 'fwrite( &input, sizeof( input ), 1, fp );' )
en 'input.c_str( );' toegevoegd, zelfde strekking maffe 'resultaat'

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Je zou ook nog fputs kunnen gebruiken:

int fputs(const char *s, FILE *stream);
fputs() writes the string s to stream, without its trailing '\0'.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Waarom gebruik je idd geen std::ofstream? Het is een beetje vreemd om twee I/O varianten te mixen

  • _Rayman_
  • Registratie: November 2001
  • Laatst online: 29-08-2023

_Rayman_

Verwacht het onverwachte.

Er ligt me iets bij, dat je moet aangeven hoe je het wilt wegschrijven (binair of ascii).

Ik vind de definitie van de variable Card ook vreemd, al zie ik niet direct de fout (mocht deze er idd zijn) :z

-edit-
Wat ik trouwens wel zie, dat als het bestand niet geopend kan worden, dat het programma gewoon doorgaat (je geeft geen else).

[ Voor 26% gewijzigd door _Rayman_ op 13-04-2005 20:50 ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Zoijar schreef op woensdag 13 april 2005 @ 20:38:
Waarom gebruik je idd geen std::ofstream? Het is een beetje vreemd om twee I/O varianten te mixen
Dat staat idd ook in m'n boek, maar zag er ingewikkeld uit.
De C file I/O heeft wat weg van de PHP style, en dat kan ik wel :)

Mss toch maar 'ns naar kijken :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Mwa...
C++:
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <fstream>
#include <string>

std::ofstream ofs("file.txt", std::ios::out);
std::string tmp;
std::cout << "Geef naam: " << std::endl;
std::cin >> tmp;
ofs << "<naam>" << tmp << "</naam>" << std::endl;

Zoiets. Best simpel.

(kan ook anders, en je moet eigenlijk op exceptions letten etc etc. maar dat deed je eerst ook al niet ;) )

[ Voor 37% gewijzigd door Zoijar op 13-04-2005 20:52 ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Zoijar schreef op woensdag 13 april 2005 @ 20:51:
Mwa...
C++:
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <fstream>
#include <string>

std::ofstream ofs("file.txt", std::ios::out);
std::string tmp;
std::cout << "Geef naam: " << std::endl;
std::cin >> tmp;
ofs << "<naam>" << tmp << "</naam>" << std::endl;

Zoiets. Best simpel.

(kan ook anders, en je moet eigenlijk op exceptions letten etc etc. maar dat deed je eerst ook al niet ;) )
Idd vrij simpel :)
Maar nu overwrite ie telkens de inhoud, tip? :)

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

C++:
1
std::ofstream ofs("file.txt", std::ios::out | std::ios::app);

En app staat voor append.

[ Voor 8% gewijzigd door Radiant op 13-04-2005 21:46 ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Hartelijk dank.
Ik moet het zelf nog leren, maar ik kan niet wachten.
Je leert meer als je bezig ermee bent, dat is iig mijn ervaring met enkele andere talen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je zou ook gewoon eens de documentatie kunnen lezen, eh ;)

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.

Pagina: 1