Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] differenza file sequenziali e file ad accesso casuale

    ciao ho un problema teorico che vorrei chiarire ( magari anche con un bel esempio pratico )
    sulla creazione dei file ;

    le lunghezze dei record di un file sequenziale non debbono essere necessariamente
    le stesse , mentre in un file binario si

    ora considerando che ad esempio un intero occuperà sempre 2byte (su certe macchine)
    e la mia struttura "X" ne occupa ad es 24 di byte

    perchè diamine con un file sequenziale mi tocca eventualmente di riscrivere l'intero file ?

    es :
    codice:
    int numero ;
    double credito ;
    char name [30] ;
    
    
    ..................
    
    
    fprintf (Ptr , "%d%s%2f" , numero , name , credito ) ;
    
    .....
    e l'output è :

    150 tony 24500.15


    supponiamo che cambio la stringa "name" da tony in elisabetta
    perchè non posso aggiornare il record del file e debbo riscriverlo tutto per intero?

    grazie

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    In realtà quelle frase significa che nel file che leggi in binario (specificando quanti byte leggere) devi sapere a priori le dimensioni.
    Mentre in un file che leggi non in modalità binaria (in realtà la lettura funziona allo stesso modo,solo che non specifichi i byte) devi mettere un carattere di separazione per far capire fino a dove fermarsi.
    Adesso mi pare che non ho capito bene il tuo problema,ma ci sono i permessi per scrivere su un file.
    Li puoi trovare qua,a questa domanda:

    supponiamo che cambio la stringa "name" da tony in elisabetta
    perchè non posso aggiornare il record del file e debbo riscriverlo tutto per intero?
    La riposta è che in realtà lo puoi fare,non è vero che non lo puoi fare,ma poi per leggerlo non sai le dimensioni.
    Il mio consiglio è di scrivere sul tuo file riga per riga,mettendo la newline come carattere separatore,così poi invece di usare la fread puoi usare la fgets,che è secondo me più comoda.

  3. #3
    Originariamente inviato da ramy89
    In realtà quelle frase significa che nel file che leggi in binario (specificando quanti byte leggere) devi sapere a priori le dimensioni.
    Mentre in un file che leggi non in modalità binaria (in realtà la lettura funziona allo stesso modo,solo che non specifichi i byte) devi mettere un carattere di separazione per far capire fino a dove fermarsi.
    Adesso mi pare che non ho capito bene il tuo problema,ma ci sono i permessi per scrivere su un file.
    Li puoi trovare qua,a questa domanda:

    La riposta è che in realtà lo puoi fare,non è vero che non lo puoi fare,ma poi per leggerlo non sai le dimensioni.
    Il mio consiglio è di scrivere sul tuo file riga per riga,mettendo la newline come carattere separatore,così poi invece di usare la fread puoi usare la fgets,che è secondo me più comoda.
    ciao forse mi hai frainteso :
    cioè quando dicevo di sostituire la stringa tony in elisabetta , avevo creato un file sequenziale ;
    poichè questa operazione secondo il manuale che uso sovrascriverebbe il record successivo , volevo capire il perchè .
    in fin dei conti lo spazio occupato in memoria è lo stesso in byte , e in effetti il manuale parla
    di formattazione dell output

    grazie

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Adesso ho capito,perchè in realtà la stringa name non sai che dimensioni ha.
    Anche se tu gli dai lo spazio per 30 caratteri,le stringhe in C sono trattate diversamente dai dati normali.
    Una stringa è una sequenza di caratteri,il compilatore non sa quando fermarsi.
    Alla fine della stringa,che è una sequenza di caratteri,per contrassegnare la fine della stringa si mettere il carattere terminatore,che ha come valore zero.
    Ad esempio :
    codice:
    char name[30];
    ...
    strcpy(name,"lady");  // la lunghezza della stringa è 5 caratteri,anche se hai allocato 30 byte occupa 5 byte,perchè
                                   // gli altri byte sono non utilizzati
    ...
    strcpy(name,"elisabetta");      // la lunghezza adesso è cambiata, la stringa è lunga 11 byte,10 char + il terminatore
    Diciamo adesso che tu scrivi la struttura su un file.
    Se tu adesso vuoi modificare il file cambiando il nome della stringa, la dimensione della stringa sarà diversa,perchè la stringa elisabetta occupa 11 byte,mentre l' altra ne occupava 5.Ecco perchè va riscritto daccapo,le dimensioni sono cambiate.
    La macchina non sa quando fermarsi a leggere,nemmeno a scrivere una stringa.Per cui si ferma quando incontra il terminatore.Graficamente il carattere terminatore non si vede neanche,con le funzioni di output non viene nemmeno stampato e se provi a stamparlo è praticamente invisible per cui non ha "effetti collaterali".

  5. #5
    ciao Ramy , dunque è ,come dice il manuale , nel modello formattato di input ouput !
    allora mi chiedo :
    che senso usare i file sequenziali , quando si ha la comodità di quelli ad accesso casuale?

    altra cosa ; provando a scrivere un file txt in modo sequenziale il mio blocconote lo legge
    tranquillamente , mentre scrivendolo in modo binario , con il blocconote visualizzo solo caratteri strani

    evidentemente qualcosa cambia , eccome !

    grazie

  6. #6
    Originariamente inviato da toni00c
    ciao Ramy , dunque è ,come dice il manuale , nel modello formattato di input ouput !
    allora mi chiedo :
    che senso usare i file sequenziali , quando si ha la comodità di quelli ad accesso casuale?

    altra cosa ; provando a scrivere un file txt in modo sequenziale il mio blocconote lo legge
    tranquillamente , mentre scrivendolo in modo binario , con il blocconote visualizzo solo caratteri strani

    evidentemente qualcosa cambia , eccome !

    grazie
    Questo cambia per il modo in cui vengono scritti un file binario e uno di testo!

    Esempio, devo scrivere 37 su un file binario: la macchina traduce tutto il numero in rappresentazione binaria e scrive tale risultato (ossia la rappresentazione interna del numero) pari pari sul file.
    Per scrivere 37 su file di testo, la macchina non traduce tutto il numero in codice binario ma solo la sua rappresentazione esterna! Quindi andrà a scrivere, nel nostro caso, la rappresentazione binaria delle cifre 3 e 7, una vicina all'altra: ciò che viene trascritta è la rappresentazione esterna del numero!

    Capisci che, andando poi a leggere, se non viene specificato in che modo è stato scritto il file, ossia se ciò che è presente sul file è la rappresentazione esterna (file di testo) o interna (file binario), si creano groooooosssssssssiii fraintendimenti!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  7. #7
    Originariamente inviato da toni00c
    ciao Ramy , dunque è ,come dice il manuale , nel modello formattato di input ouput !
    allora mi chiedo :
    che senso usare i file sequenziali , quando si ha la comodità di quelli ad accesso casuale?

    altra cosa ; provando a scrivere un file txt in modo sequenziale il mio blocconote lo legge
    tranquillamente , mentre scrivendolo in modo binario , con il blocconote visualizzo solo caratteri strani

    evidentemente qualcosa cambia , eccome !

    grazie
    Per leggere un file scritto in binario esistono editor di testi di file binari (che ti "decodifica" i caratteri "strani"). Su ubuntu si usa HexEdit che esiste anche su winzoz
    con questo dovresti poter vedere il tuo file (la faccina contiene il link )

    Non lo ho testato ma dovrebbe andare O_O

  8. #8
    Originariamente inviato da Laikius91
    Questo cambia per il modo in cui vengono scritti un file binario e uno di testo!

    Esempio, devo scrivere 37 su un file binario: la macchina traduce tutto il numero in rappresentazione binaria e scrive tale risultato (ossia la rappresentazione interna del numero) pari pari sul file.
    Per scrivere 37 su file di testo, la macchina non traduce tutto il numero in codice binario ma solo la sua rappresentazione esterna! Quindi andrà a scrivere, nel nostro caso, la rappresentazione binaria delle cifre 3 e 7, una vicina all'altra: ciò che viene trascritta è la rappresentazione esterna del numero!

    Capisci che, andando poi a leggere, se non viene specificato in che modo è stato scritto il file, ossia se ciò che è presente sul file è la rappresentazione esterna (file di testo) o interna (file binario), si creano groooooosssssssssiii fraintendimenti!
    ciao sto finendo di rivedere alcuni lucidi della Mello e mi è venuto questo dubbio ;
    in realtà nel manuale che uso non è spiegato un granchè bene , invece
    devo dire che i lucidi della prof sono molto più approfonditi


    tutto chiare adesso

    grazie a tutti

  9. #9
    Originariamente inviato da toni00c
    ciao sto finendo di rivedere alcuni lucidi della Mello e mi è venuto questo dubbio ;
    in realtà nel manuale che uso non è spiegato un granchè bene , invece
    devo dire che i lucidi della prof sono molto più approfonditi


    tutto chiare adesso

    grazie a tutti
    Dovere
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.