/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
gemme på disk
Fra : kash


Dato : 18-03-01 14:11

jeg skal have gemt dataen fra klassen på disk og så læse fra den igen.
hvordan kan funktionerne gem og hent laves???

#include <iostream>
#include <string>
using namespace std;

class beboer
{
private:
   string navn;
public:
   void data()
   {   
      cout << "Indtast navn: ";
      cin >> navn;
   }

/*   void gem();   
   void hent();   */
};


void main ()
{
   beboer b1;
   
   b1.data();
/*   b1.gem();
   b1.hent();*/
   
}

 
 
R. A. Larsen (21-03-2001)
Kommentar
Fra : R. A. Larsen


Dato : 21-03-01 10:35

"Christian Drivsholm" <i29448@inet.uni2.dk> wrote:
> Hej Kash
>
> Jeg vil nok foretrække, at bruge følgende programkode:
[Resten er klippet i stykker for kun at tage det mest nødvendige]
> class information
> {
> public:
> char *navn;
> int alder;
> };
>
> information info;
[klip]
> fwrite(&info, sizeof(info), 1, fp);

Dette vil aldrig virke. Prøv selv at se hvor stor "info" er.
Årsag: "info.navn" er en pointer til en char, dvs en adresse. Du skriver
derfor *hvor* indholdet ligger i hukommelsen, og ikke selve indholdet. Hvis
navn havde været defineret som char navn[100], havde koden virket.

PS. Kære Christian Drivsholm, kan man få dig til at erstatte Sv: med Re: i
subject-linjen?

MVH, René
--
Using Virtual Access
http://www.vamail.com


klaus hebsgaard (21-03-2001)
Kommentar
Fra : klaus hebsgaard


Dato : 21-03-01 10:39

> jeg skal have gemt dataen fra klassen på disk og så læse fra den igen.
> hvordan kan funktionerne gem og hent laves???
Nu skulle du vel ikke være så heldig at du bruger noget MFC eller det
framework, der følger med Borlands compiler.
Hvis du gør, så er der allerede nogle funktioner, der helt automatisk kan
gøre det for dig.
For det du ønsker er vel serialsering af objekter..

/Klaus Hebsgaard



Christian Drivsholm (21-03-2001)
Kommentar
Fra : Christian Drivsholm


Dato : 21-03-01 21:33

Hej igen kash

Hvad med denne programkode:

file://---------------------------------------------------------------------
------
#include <vcl.h>
#include <string>
#include <fstream>
#include <iostream.h>
#include <conio.h>
#include <stdio>
#pragma hdrstop
file://---------------------------------------------------------------------
------
#pragma argsused
class data
{
public:
String navn;
int alder;
};

int main()
{
ofstream udfil("datafil", ios::binary);
data klasse;
// GEM Navne
klasse.navn = "Christian";
klasse.alder = 10;
udfil.write((char*)&klasse, sizeof(klasse));

klasse.navn = "Inger";
klasse.alder = 5;
udfil.write((char*)&klasse, sizeof(klasse));

klasse.navn = "Nicoline";
klasse.alder = 55;
udfil.write((char*)&klasse, sizeof(klasse));

udfil.close();

// LÆS Navne
ifstream indfil("datafil", ios::binary);
// læs navn nummer 3, dvs record nummer 3-1 = 2 !!!
int record = 2;
indfil.seekg(record*sizeof(klasse));
indfil.read((char*)&klasse, sizeof(klasse));

// CHECK på skærm
char buff[10];
strcpy(buff, klasse.navn.c_str());
cout << buff << endl;
cout << klasse.alder << endl;

indfil.close();

getch();
return 0;
}
file://---------------------------------------------------------------------
------

Hilsen
Christian Drivsholm
Århus
www.christiandrivsholm.suite.dk










kash <kash@worldonline.dk> skrev i en
nyhedsmeddelelse:3ab4b1c1.8035253@news.worldonline.dk...
> jeg skal have gemt dataen fra klassen på disk og så læse fra den igen.
> hvordan kan funktionerne gem og hent laves???
>
> #include <iostream>
> #include <string>
> using namespace std;
>
> class beboer
> {
> private:
> string navn;
> public:
> void data()
>

> cout << "Indtast navn: ";
> cin >> navn;
> }
>
> /* void gem();
> void hent(); */
> };
>
>
> void main ()
> {
> beboer b1;
>
> b1.data();
> /* b1.gem();
> b1.hent();*/
>
> }



Igor V. Rafienko (22-03-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 22-03-01 16:20

* Christian Drivsholm

[snip]

> Hvad med denne programkode:


Hva om å i det minste sjekke at koden ikke tryner? Nei, koden under
vil _ikke_ fungere (hint: hvordan er String implementert innvendig?).


> #include <vcl.h>


nei.


> #include <string>
> #include <fstream>
> #include <iostream.h>


nei.


> #include <conio.h>


nei.


> #include <stdio>


nei.


> class data
> {
> public:
> String navn;
^

? Men hey, what the heck. La oss anta at String innvendig ser ca. slik
ut:

class String
{
char *data;
size_t length;
};


> int alder;
> };
>
> int main()
> {
> ofstream udfil("datafil", ios::binary);
> data klasse;
> // GEM Navne
> klasse.navn = "Christian";
> klasse.alder = 10;
> udfil.write((char*)&klasse, sizeof(klasse));


Under antagelsen over, hva vil vi få her. Joda, "klasse" inneholder 2
felt, String og int. int'en skrives rett ut, og det er neppe
problematisk. String derimot blir skrevet som:

+-----------+----+
| 0xdeadbeef| 10 |
+-----------+----+

dvs at man lagrer adressen til "Christian" på filen. Tror du virkelig
at denne adressen har noe som helst mening fra en run til en annen?

Og alt dette på et meget _banalt_ eksempel. Hva om kompilatoren padder
struct'er med viktig informasjon? Hva skjer i en tradisjonell
implementasjon av virtuelle funksjoner via en __vtable peker?


> // LÆS Navne
> ifstream indfil("datafil", ios::binary);
> // læs navn nummer 3, dvs record nummer 3-1 = 2 !!!
> int record = 2;
> indfil.seekg(record*sizeof(klasse));
> indfil.read((char*)&klasse, sizeof(klasse));


Og her leser man tilbake int'en + "0xdeadbeef" + 10. Adressen
0xdeadbeef har ikke nødvendigvis mening i en annen run.


> // CHECK på skærm
> char buff[10];
> strcpy(buff, klasse.navn.c_str());


Og her får man segmentation fault. (btw, hva skal man med strcpy
her?).





ivr
--
Death by snoo-snoo

Martin Moller Peders~ (28-03-2001)
Kommentar
Fra : Martin Moller Peders~


Dato : 28-03-01 10:16

In <3ab4b1c1.8035253@news.worldonline.dk> kash@worldonline.dk (kash) writes:

>jeg skal have gemt dataen fra klassen på disk og så læse fra den igen.
>hvordan kan funktionerne gem og hent laves???

Fandt lige dette library:

http://members.home.net/mikpos/libbinio/

/Martin


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste