[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Programmino in C



Giovanni Mascellani scrisse in data 24/07/2007 11:12:
> Non entro nello specifico del tuo problema, perché non so usare
> Postgres e tutte le altre cose che dicevi.
>   
Grazie, ti apprezzo molto anche per questo.

> Scrivere un programmino come dici tu non è facile, perché in ogni caso
> se aggiungi dei byte a metà di un file senza voler sovrascrivere vuol
> dire che comunque devi riscrivere tutto il file da quel punto in poi
> per spostare in avanti i caratteri. E questo, ovviamente, le librerie
> standard non te lo permettono.
>   
Lo temevo... ma mi piacerebbe scriverlo, anche soltanto per rispolverare
quelle conoscenze di C che si sono perse negli anni...

> Per quanto ne so io, l'unica soluzione che riesco a pensare è quella
> di, appunto, riscriverti tutto il file. Leggi sequenzialmente
> l'originale e lo copi in un file temporaneo (o anche nella RAM, se non
> è esageratamente grosso), tranne per il fatto che quando trovi un punto
> in cui devi aggiungere qualcosa lo aggiungi tranquillamente. Poi quando
> hai finito o copi il file temporaneo al posto dell'originale o, se
> stavi memorizzando in RAM, chiudi il file in lettura e lo riapri in
> lettura troncandolo e ci scrivi sopra tutto. Ora che ci penso, puoi
> risparmiare un po' di memoria se l'aggiunta delle nuove righe la fai
> dopo aver copiato in memoria (quindi in fase di riscrittura) invece che
> prima.
>   
Forse non è poi così complicato... ho notato che la posizione che mi
ritorna ftell corrisponde esattamente ai caratteri letti nel file... per
la cancellazione potrei con fgets posizionarmi sulla riga da cancellare,
memorizzarmi con fread in un buffer il rimanente del file per poi
andarlo ad inserirlo con fwrite alla riga in cui mi sono posizionato;
analogamente per l'inserimento.

Ma quello che mi chiedevo è: è un caso che la posizione che ritorna
ftell corrisponda proprio al numero di caratteri dall'inizio del file in
cui si è posizionati? Qualcuno ne sa qualcosa?

Grazie mille

Piviul



Reply to: