C:Come spostarsi all'interno di un file?

di Anonimizzato25192 il
14 risposte
Buonasera, mi sto dedicando allo studio dei file in c. Volevo chiedere, c'è un modo per spostarsi comodamente all'interno di un file?
faccio un esempio concreto:
apro il file, sono all'ultima posizione scritta, mettiamo caso che io debba tornare alla prima riga e cancellarla, come posso fare?. Cioè come posso ritornare dall'ultima riga scritta di un file a una riga precisa per poi modificarla/cancellarla?
Grazie a tutti per l'aiuto

14 Risposte

  • oregon ha scritto:


    Non lavori per "righe" ma per byte.

    Utilizzi le funzioni seguenti

    https://digilander.libero.it/uzappi/C/librerie/funzioni/fseek.html

    E non puoi "cancellare righe" da un file comodamente ... a prescindere dal C.
    Grazie mille. Quindi la soluzione migliore per cancellare un qualcosa è semplicemente ricreare il file?
  • Sì, ovviamente dovrai farlo con un nuovo nome. Dopo cancelli il vecchio e rinomini quello creato.
  • oregon ha scritto:


    Sì, ovviamente dovrai farlo con un nuovo nome. Dopo cancelli il vecchio e rinomini quello creato.
    Io pensavo più a copiare tutto in un record, chiudere quello corrente. E poi riaprirlo in modalità scrittura e sovrascriverlo
  • Adesso parli di record ma prima dicevi che gestivi linee.

    Se non sono record a lunghezza fissa non puoi farlo. Se parliamo di linee di testo di qualsiasi lunghezza, non puoi.

    Quindi di chiarisci che tipo di file parli e il suo contenuto.
  • oregon ha scritto:


    Adesso parli di record ma prima dicevi che gestivi linee.

    Se non sono record a lunghezza fissa non puoi farlo. Se parliamo di linee di testo di qualsiasi lunghezza, non puoi.

    Quindi di chiarisci che tipo di file parli e il suo contenuto.
    Parlo di record in quanto mi è stato detto che non posso muovermi all'interno di un file per cancellare la linea.
    Mi è stato consigliato di riscriverlo;
    Quindi ho pensato. Salvo tutto il contenuto di un file in un record, poi lo riapro in modalità scrittura e copio tutto quello del record tranne la linea da eliminare. può funzionare no?
  • In generale, no.

    tipicamente (oggi) si carica l'intero file in memoria, si elabora, e poi lo si riscrive in un colpo solo.
    questo funziona bene fino a dimensioni abbastanza consistenti (decine-centinaia di MB), in quanto le macchine moderne hanno grandi disponibilità di memoria (...ahh... una volta... si scrivevano i programmi nel buffer del registratore a nastro).

    gli approcci che richiedono quantità di dati maggiori, tipicamente, prevedono l'appoggio a un qualche genere di database
  • Magari dico una scemata, però non sarebbe possibile definire uno spazio di dimensioni fisse che si possono presumere come dimensioni massime di una "riga", e poi trattare lo spazio su disco come se fosse uno spazio in memoria? A quel punto, cancellare una "riga" potrebbe significare azzerare un'area per marcarla come "vuota" (eventualmente potrebbe essere riutilizzata in seguito per una nuova "riga", oppure si potrebbe "compattare" il file, magari riordinando le "righe" secondo un qualche criterio).
  • @Anonimamente
    Salvo tutto il contenuto di un file in un record, poi lo riapro in modalità scrittura e copio tutto quello del record tranne la linea da eliminare. può funzionare no?
    Non capisco il senso di questa tua frase. Cosa è per te un record? Forse fai molta confusione sulle conoscenze di base, e questo ti porta a scrivere cose senza senso. L'unico approccio sensato è leggere, operare sui dati e riscrivere il file.

    @AldoBaldo
    no, non va bene, non si "marca" nulla ... non ha senso "compattare" perché dovresti fare un lavoro assurdo di lettura/riscrittura sicuramente molto più pesante della normale operazione di read-change-write del file.
  • oregon ha scritto:


    @Anonimamente
    Salvo tutto il contenuto di un file in un record, poi lo riapro in modalità scrittura e copio tutto quello del record tranne la linea da eliminare. può funzionare no?
    Non capisco il senso di questa tua frase. Cosa è per te un record? Forse fai molta confusione sulle conoscenze di base, e questo ti porta a scrivere cose senza senso. L'unico approccio sensato è leggere, operare sui dati e riscrivere il file.

    @AldoBaldo
    no, non va bene, non si "marca" nulla ... non ha senso "compattare" perché dovresti fare un lavoro assurdo di lettura/riscrittura sicuramente molto più pesante della normale operazione di read-change-write del file.
    Nel senso; creo un normale record; una struttura con i vari campi (interi, stringhe etc).
    E ci copio dentro i contenuti del FIle. Ora avendoli nel mio record, posso chiudere il file riaprirlo in modalità scrittura, e copiarci dentro i contenuti del mio record
  • In questo caso sì perché il file sarebbe binario con record a lunghezza fissa.
  • oregon ha scritto:


    In questo caso sì perché il file sarebbe binario con record a lunghezza fissa.
    Grazie mille mi scuso per essere stato poco chiaro e aver portato incomprensione
  • Di nulla... ma se non va qualcosa posta il codice così ci capiamo meglio
  • oregon ha scritto:


    Di nulla... ma se non va qualcosa posta il codice così ci capiamo meglio
    Tutto funziona alla perfezione ti ringrazio ancora per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
14 risposte