erlug
[Top] [All Lists]

Re: [Erlug] stesso problema

To: erlug@xxxxxxxxxxxxxx
Subject: Re: [Erlug] stesso problema
From: "Ivan Sergio Borgonovo" <mail@xxxxxxxxxxxxxxx>
Date: Wed, 3 Apr 2002 18:06:40 +0200
On 3 Apr 2002 at 11:48, Simone Saravalli wrote:

> Ciao a tutti, ringrazio coloro che mi hanno risposto circa il mio
> problema con fread e fwrite, ma non ci ho capito moltissimo, perciò ora
> provo a spiegare meglio il mio problema. Allora, io ho un file con
> all'interno delle stringhe non ordinate alfabeticamente. Per fare questo
> l'unica soluzione che mi è venuta in mente è quella di scrivere le varie
> stringhe in un'area di memoria (e qui avevo pensato ad un array di
> puntatori a char) per poterle poi ordinare con un algoritmo di
> ordinamento. Una volta che le stringhe sono oedinate le scrivo
> nuovamente sul file di origine. Ora, ho capito che il problema risiede
> nel fatto che verrebbere scritti sul file i puntatori e non le stringhe,
> ma allora come faccio ad ordinarle???

io considererei fgets, volendo ragionare per linee,
o anche fscanf... (e rispettivi in scrittura).

Il problema è l'allocazione della memoria...

Ovviamente anche il numero delle linee è incognito fino a quando non
sei a fine file.

I due estremi sono allocare un numero fissato di linee e una lunghezza
massima per stringa o allocare dinamicamente sia lo spazio per ogni
stringa, sia lo spazio per l'array di puntatori alle stringhe.

La strategia di allocazione della memoria dipende molto da quanto sono
lunghe le stringhe e quante sono.

Facciamola breve...

Se l'array dei puntatori cambia di dimensione ti trovi costretto a
ricopiarlo tutto da un'altra parte dove puoi allungarlo e sull'array di
puntatori hai un discreto vantaggio nell'efficienza dell'algoritmo se
usi un array piuttosto che una lista (elemento che contiene il
puntatore all'elemento successivo e/o anche precedente).

Questi ragionamenti potrebbero essere poco validi se ti aspetti file
con 10 linee di 30Kb l'una... se hai file molto grossi etc...

Quindi supponiamo che a priori decidi che il file da sortare non
contiene più di X elementi.

Ti fai un array di puntatori a char*

e lo carichi e scarichi in un loop...

In lettura \n (o \r\n) ti fa da "terminatore" quindi la parte del
sapere quanto è lunga la stringa te la fa fgets/fscanf.

Usi un buffer temporaneo che poi copi in quello definitivo con le
dimensioni minime per contenere la stringa oppure chiedi più spazio e
poi disallochi la memoria di avanzo...

Una stringa lunga è lunga da copiare... tuttavia allocazione e
disallocazione della memoria hanno un certo overhead e poi rischi di
frammentarti la memoria.

L'ordinamento ti conviene farlo solo sulla lista dei puntatori... le
stringhe ovviamente le lasci dove le hai allocate.

Comunque io scrivo solo programmi senza input ne output...
contemplativi :))


Pubblicità progresso: come mi piace il C++


--
Salve
Ivan Sergio Borgonovo
http://www.webthatworks.it/
uniq life || sleep 24h



<Prev in Thread] Current Thread [Next in Thread>