Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371

    [c] lettura e scrittura su file infinita

    ciao a tutti, ho un problema con un parte di codice:

    ...
    while(cout<<fread(&persona, sizeof(record), 1, fp))
    {
    persona.prova=0;
    fseek(fp, -sizeof(record), 1);
    fwrite(&persona, sizeof(record), 1, fp);
    }
    ...

    Questa parte di codice dovrebbe leggere una struct di tipo record da un file(aperto in r+), modificarne il campo prova e riscriverla sul file, purtroppo mi va vanti all'infinito, mentre se elimino fseek e fwrite fa il giusto numero di cicli...
    non riesco a capirne il motivo... :master:

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Spiega meglio il problema ... perchè usi la fseek per tornare indietro?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    io devo modificare il contenuto del file, perciò lo carico in memoria leggendo la parte che mi interessa, la modifico e poi lo riscrivo su file

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    E a cosa serve il ciclo while?

    Se devi fare quello che dici, fai una fseek e una fread per leggere e una fseek e una fwrite per scrivere.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    il ciclo serve perché il file contiene molte struct(non so se è corretto dire cosi) e io con il while carico una struct alla volta e la modifico
    leggo con fread (il puntatore scorre in avanti), modifico la struct, riporto indietro il puntatore con fseek e con fwrite riscrivo la struct sul file (il puntatore riscorre in avanti) e cosi via...
    è corretto il mio ragionamento???

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Corretto ma

    1) non devi usare la cout in quel modo (perchè la while non valuterà quello che è restituito dalla fread)

    2) devi resettare il puntatore (con una fseek) quando passi da scrittura a lettura

    Ti consiglio infine, di usare le costanti per la fseek

    Quindi, il ciclo diventerà

    codice:
    while(fread(&persona, sizeof(record), 1, fp))
    {
        fseek(fp, -sizeof(record), SEEK_CUR);
        persona.prova=0;
        fwrite(&persona, sizeof(record), 1, fp);
        fseek(fp, 0, SEEK_CUR);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    ottimo funziona, grazie mille
    per il cout l'avevo messo io per fare una prova ed avevo dimenticato di toglierlo...
    una domanda: ma la fseek non si limita a spostare il puntatore??? cosa vuol dire che lo resetta???
    altra domanda: perché mi consigli di usare le costanti??? qual'è il vantaggio???

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da davidinho
    una domanda: ma la fseek non si limita a spostare il puntatore??? cosa vuol dire che lo resetta???
    In che senso? Dove l'hai letto?

    altra domanda: perché mi consigli di usare le costanti??? qual'è il vantaggio???
    Per evidenti motivi ... sono piu' leggibili (meglio SEEK_CUR di 1), non cambi il programma se cambia il valore, non devi conoscere il vero valore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    intendo dire che fseek si dovrebbe limitare a cambiare la posizione del puntatore giusto???
    allora cosa vuol dire che devo utilizzarla per resettare la posizione del puntatore???
    se non la resetto cosa succede???

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non si limita a questo, ma solo per i file aperti in lettura/scrittura (update), provvede a impostare correttamente i valori interni dello stream (la struttura FILE) per prepararsi alla lettura dopo una scrittura e viceversa.

    Leggi questo

    http://www.cplusplus.com/reference/c.../cstdio/fseek/

    dove dice

    "On streams open for update (read+write), a call to fseek allows to switch between reading and writing.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.