C:Come spostarsi all'interno di un file?

di il
14 risposte

C:Come spostarsi all'interno di un file?

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

  • Re: C:Come spostarsi all'interno di un file?

    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.
  • Re: C:Come spostarsi all'interno di un file?

    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?
  • Re: C:Come spostarsi all'interno di un file?

    Sì, ovviamente dovrai farlo con un nuovo nome. Dopo cancelli il vecchio e rinomini quello creato.
  • Re: C:Come spostarsi all'interno di un file?

    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
  • Re: C:Come spostarsi all'interno di un file?

    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.
  • Re: C:Come spostarsi all'interno di un file?

    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?
  • Re: C:Come spostarsi all'interno di un file?

    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
  • Re: C:Come spostarsi all'interno di un file?

    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).
  • Re: C:Come spostarsi all'interno di un file?

    @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.
  • Re: C:Come spostarsi all'interno di un 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
  • Re: C:Come spostarsi all'interno di un file?

    In questo caso sì perché il file sarebbe binario con record a lunghezza fissa.
  • Re: C:Come spostarsi all'interno di un file?

    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
  • Re: C:Come spostarsi all'interno di un file?

    Di nulla... ma se non va qualcosa posta il codice così ci capiamo meglio
  • Re: C:Come spostarsi all'interno di un file?

    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