/ 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
Filhåndtering
Fra : Tonni Ryborg


Dato : 15-01-01 19:41

Jeg har et problem, med min filhåndtering. Programmet skal kunne gemme flere
objekter på disken, men jeg kan kun få den til at gemme den sidst indtastede
værdi. Glemmer jeg at "spole" tilbage?

void lagring(aktie dettepapir, int valg)
{ if (valg==1)
{ ofstream aktiefil("A:\\AKTIE.DAT",ios::in | ios::app);
aktiefil.write((char*) &dettepapir, sizeof(aktie));
aktiefil.close();
}
if (valg==2)
{ ifstream aktiefix("A:\\AKTIE.DAT",ios::out | ios::beg);
while (!aktiefix.eof())
{ aktiefix.read((char*) &dettepapir, sizeof(aktie));
dettepapir.vis_aktie();
}
aktiefix.close();
getch();
}
}

Tonni



 
 
Christian Worm Morte~ (15-01-2001)
Kommentar
Fra : Christian Worm Morte~


Dato : 15-01-01 20:06

Hej,

> Jeg har et problem, med min filhåndtering. Programmet skal kunne gemme
flere
> objekter på disken, men jeg kan kun få den til at gemme den sidst
indtastede
> værdi. Glemmer jeg at "spole" tilbage?

Ikke at jeg er eksperet på standard io biblioteket, men:

> { ofstream aktiefil("A:\\AKTIE.DAT",ios::in | ios::app);
.....
> { ifstream aktiefix("A:\\AKTIE.DAT",ios::out | ios::beg);

for mig ser flagene ios::in og ios::out ud til at være placeret forkert og
de er vel egentlig overflødige?

Noget andet er at dette også ser meget skummelt ud:

> while (!aktiefix.eof())
> { aktiefix.read((char*) &dettepapir, sizeof(aktie));
> dettepapir.vis_aktie();
> }

Man kan ikke bare skrive en klasse til en fil og så læse den ind igen på
denne måde. I hvert fald ikke hvis den indeholder virtuelle metoder. Om man
kan hvis den ikke gør kender jeg ikke standarden godt nok til at kunne
udtale mig om.


Venlig Hilsen

Christian Worm



N/A (15-01-2001)
Kommentar
Fra : N/A


Dato : 15-01-01 21:08



Rasmus Bøg Hansen (15-01-2001)
Kommentar
Fra : Rasmus Bøg Hansen


Dato : 15-01-01 21:08

On Mon, 15 Jan 2001, Tonni Ryborg wrote:

>
> ...
> > Hej,
> >
> > > Jeg har et problem, med min filhåndtering. Programmet skal kunne gemme
> > flere
> > > objekter på disken, men jeg kan kun få den til at gemme den sidst
> > indtastede
> > > værdi. Glemmer jeg at "spole" tilbage?
> >
> > Ikke at jeg er eksperet på standard io biblioteket, men:
> >
> > > { ofstream aktiefil("A:\\AKTIE.DAT",ios::in | ios::app);
> > ....
> > > { ifstream aktiefix("A:\\AKTIE.DAT",ios::out | ios::beg);
> >
> > for mig ser flagene ios::in og ios::out ud til at være placeret forkert og
> > de er vel egentlig overflødige?
> >
> > Noget andet er at dette også ser meget skummelt ud:
> >
> > > while (!aktiefix.eof())
> > > { aktiefix.read((char*) &dettepapir, sizeof(aktie));
> > > dettepapir.vis_aktie();
> > > }
> >
> > Man kan ikke bare skrive en klasse til en fil og så læse den ind igen på
> > denne måde. I hvert fald ikke hvis den indeholder virtuelle metoder. Om
> man
> > kan hvis den ikke gør kender jeg ikke standarden godt nok til at kunne
> > udtale mig om.
> >
> Har du nogle ideer til hvordan jeg ellers skulle gøre det?

Gemme dataene i et platform-uafhængig (eller i det mindste
oversætter-uafhængig) format. Det er lidt svært at sige mere, når vi
ikke kender klassedefinitionen for dettepapir.

Rasmus Bøg Hansen


Christian Worm Morte~ (16-01-2001)
Kommentar
Fra : Christian Worm Morte~


Dato : 16-01-01 09:29

Hej,

> > Har du nogle ideer til hvordan jeg ellers skulle gøre det?

Hmm - jeg har ikke fået dette brev. Det pæne er jo at definere en "<<"
operator på din klasse så du kan skrive noget i stil med

myoutstreem << post_i_mit_kartotek;

Men det løser ikke det fundamentale problem. Den lette løsning er at lægge
alle datafelterne over i en struktur (uden virtuelle metoder) og så skrive
den på den måde du gør. Dermed vil dit program blive gyldigt, men det bliver
ikke særlig portabelt som nævnt af andre. Hvis det skal være portabelt er
der nok ikke meget andet at gøre end at skrive et felt ud og læse et felt
ind af gangen.

Alternativt kan man benytte Java som har direkte understøttelse for præcist
den slags her.


Venlig Hilsen

Christian Worm




Igor V. Rafienko (15-01-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 15-01-01 20:24

* Tonni Ryborg

[snip]

> void lagring(aktie dettepapir, int valg)


Send-by-value? Sure?


> { if (valg==1)
> { ofstream aktiefil("A:\\AKTIE.DAT",ios::in | ios::app);


ofstream som er åpnet med ios::in (jeg antar du mener ios_base::in)?
Det ser litt pointless ut, spør du meg.


> aktiefil.write((char*) &dettepapir, sizeof(aktie));


Don't do that. Hvorfor skulle du lagre data på en måte som er ikke
kompatibel mellom forskjellige kompilatorer på den samme arkitekturen?

[snip]





ivr
--
Much of this software was user-friendly, meaning that it was intended
for users who did not know anything about computers, and furthermore
had absolutely no intention whatsoever of learning.
   -- A. S. Tanenbaum, "Modern Operating Systems, ch 1.2.4"

N/A (15-01-2001)
Kommentar
Fra : N/A


Dato : 15-01-01 21:18



Igor V. Rafienko (15-01-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 15-01-01 21:18

* Tonni Ryborg

[snip]

> Hvad skal jeg gøre i stedet for?


Følge rådene til Rasmus.





ivr
--
Much of this software was user-friendly, meaning that it was intended
for users who did not know anything about computers, and furthermore
had absolutely no intention whatsoever of learning.
   -- A. S. Tanenbaum, "Modern Operating Systems, ch 1.2.4"

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste