Newsgroup: it.comp.os.linux.sys
Titolo: molto urgente--lseek--modifica di un file

ciao a tutti,
ho un problema: supponiamo di avere un file su disco chiamato "file.txt", i
record inseriti sono questi:
1234 2 5678 3 12354 4   53456 3 333 3 2222 4
supponiamo di dover eliminare il record successivo a 5678, cioe' il record
"3".
come faccio?
la soluzione che ho trovato è quella di copiare il tutto su un file di
appoggio, ma non funziona sul programma su cui va montata, perchè i record
mi si vanno ad accodare sul file.txt (cioe' quando li scrive non cancella
quelli gia' esistenti), e poi se ho 100000 record mi ci vuole un mese!
si puo' fare di meglio?
grazie a tutti,
fabio

 si puo' fare di meglio?
Forse si.
bye,
-- 
   Piergiorgio Sartor

 come faccio?
Beh... in effetti la questione non e' cosi' semplice...
I record sono tutti a lunghezza fissa ?
Come va interpretato questo file ?
Puoi inserire un campo "valido" per i record ?
In ogni caso mi sembra un po' un problema da "teoria dei DB"...
Potresti provare a cercare qualcosa sui metodi di storage dei database ;)
Edo



Ciao, non è molto chiaro cio' che vuoi. Per esempio non si capisce
se il file ha piu' di una riga (e credo di si) e se quando vuoi eliminare
un record vuoi farlo da tutte le righe. Se le cose stanno come credo di
aver capito prova a fare cosi':
(supponiamo di voler eliminare il record tre di una riga di n record)
cat file.txt | awk '{print $1,$2,$4,$5,....$n}' >> file_temporaneo.txt
mv file_temporaneo.txt file.txt
o puoi usare il cut (se il separatore di campi e' sempre lo stesso,e
supponiamo sia lo spazio):
cat file.txt | cut -f 1,2,4,5,6,...n -d " " >> file_temporaneo.txt
Certo che se i campi di ogni riga sono un'enormita' allora questo non e'
molto utile. Potresti in quel caso usare fare uno script che prenda come
parametro il numero del campo da eliminare.
Se poi al posto del record eliminato devi cmq lasciare qualcosa..allora
e' un pochino piu' complicato, bisognerebbe usare anche sed..ma a questo
punto sei quasi costretto a usare un script.
ciao
-- 
-- togli le mani dal mio indirizzo se vuoi contattarmi --

 Come va interpretato questo file ?
mi interessa cambiare il secondo blocco da 4(quello con un numero solo x
intenderci)
 puoi inserire un campo"valido" per i record ?
cosa č un campo valido?



vuol dire che questo è un pezzo di un programma ben piu' lungo, questa è
solo un pezzo della parte riguardante la gestione dei file..


 Se poi al posto del record eliminato devi cmq lasciare qualcosa..
si, il record lo devo modificare o cancellare e riscrivere giusto,  male che
vada


 solo un pezzo della parte riguardante la gestione dei file..
Sarebbe da verificare che non vi siano interferenze.
Il file deve essere aperto-modificato-chiuso, per
avere un modulo indipendente, altrimenti potresti
avere problemi.
Comunque "dd" con l'opzione "notrunc" potrebbe fare
al caso tuo. Nel caso ti serva codice C... Scaricati
i sorgenti di "dd"... :-)
bye,
-- 
piergiorgio

 sto facendo programmazione di sistema...
se la soluzione la "volevi" ;) in C allora temo tu debba
specificare un po' meglio, cosi' non si capisce un granche'
(almeno io)
uno spunto:
in linea di massima, se chi ha creato il file lo ha creato con
l'idea che tale file dovesse essere portato interamente in
memoria all'inizio del programma e poi aggiornato sul disco solo in
caso di aggiunte/cancellazioni/modifiche, allora segui lo stesso
principio, lo carichi in un array, cancelli, modifichi il
puntatore ;) al successivo e riscrivi. fine, se anche fosse di
100000 campi ci impiegheresti poco (una volta capita le
struttura del file e creato l'array adatto)
se invece chi ha creato il file lo ha pensato come una insieme
di dati da leggere "solo quello/quando interessa" ossia nessuna
lettura completa (tipicamente perche' il file e' davvero molto
grande e/o contiene informazioni richieste poco) allora al
99.99% c'e' la possibilita' di marcare un campo come
inutilizzato e (al limite) compattare l'archivio di tanto in
tanto.
ma se il file ha dimensioni umane (nel tuo caso un pochetto meno
della ram che hai installato ;) vai con il primo tentativo
a essere sinceri pero' non era da postare su it.*linguaggi*C ?
o cercavi un lseek che modificasse il puntatore del file ;)
-- 
nebbia

 cosa è un campo valido?
se vuoi eliminare fisicamente il record probabilmente il modo piu'
semplice e' utilizzare un campo aggiuntivo nel record che ti indica se
quello che stai considerando e' un record valido o no (ad esempio e'
stato cancellato).
Edo


vado e scarico..