|
| 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"
| |
|
|