* Jeppe Sørensen
[snip]
> Jeg har længe tænkt på hvordan man hurtigst og nemmest kan gemme en
> structer i fil.
Hva er kravene til applikasjonen? Hva skal kunne lese denne filen
tilbake (samme programmet på samme arkitektur, noe annet)? Hvor
portabelt vil du ha dette? Hva inneholder struct'en? (innlysende nok
blir det ikke-trivielt å "linearisere" en sirkulær liste). Forresten,
"hurtigst" og "nemmest" er oftest motstridende. Dersom arv er med i
bildet, blir det enda mer ekkelt.
> Og hvordan man hurtigst og nemmest kan opdater filen hvis 1 af
> variablerne i structer bliver ændret.
Portabelt? Rå minnedump til filen er nødvendigvis det raskeste dersom
det er kun tiden å eksekvere operasjonen som er interessant, men jeg
ville ikke anbefale denne metoden -- det virker "liksom", men ikke
akkurat: på Linux tar struct'en under 16 bytes, mens på sparc er
tallet 24. Naturligvis har man _ingen_ garanti for at en
compiler-switch ikke får hele greia til å tryne (fx. dersom man gir
beskjed om å pakke struct'er fra en run til en annen). Og det at g++
og CC5.1 har tilfeldigvis samme struct layout kan man nok ikke regne
med i det generelle tilfellet.
Kode #include <iostream>
#include <fstream>
#include <string>
struct A
{
A( int i, double j, int k ) : x( i ), f( j ), y( k ){}
A(){}
private:
int x;
protected:
double f;
private:
int y;
friend std::ostream& operator<<( std::ostream&, const A& );
};
std::ostream&
operator<<( std::ostream &os, const A &s )
{
os << "<struct A: " << s.x << "; " << s.f << "; " << s.y << ">\n";
return os;
}
void
read( const char *fname )
{
A a;
std::ifstream ifs( fname );
if ( !ifs.read( (char*)&a, sizeof a ) ) {
std::cerr << "failed to read\n";
}
std::cout << a;
}
void
write( const char *fname )
{
A a( 10, 42.5, 12 );
std::ofstream ofs( fname );
if ( !ofs.write( (char*)&a, sizeof a ) ) {
std::cerr << "failed to write\n";
}
std::cout << a;
}
int
main( int argc, char *argv[] )
{
if ( argc != 3 ) {
std::cerr << "foo\n";
return 1;
}
if ( std::string( argv[1] ) == "read" )
read( argv[2] );
else
write( argv[2] );
} |
ivr
--
Death by snoo-snoo