Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Lettura/Scrittura file
Forum - C/C++ - Lettura/Scrittura file

Avatar
deoiang (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/05/2009

Segnala al moderatore
Postato alle 20:22
Lunedì, 11/05/2009
Ciao ragazzi,

sto scrivendo un programma che scolge spesso operazioni di I/O per non occupare troppa memoria ram, in particolare prende blocchi di dati in lettura, li elabora, e successivamente li riscrive nel file dove l'ha letti.

E' possibile scrivere in un file con modalità append (in coda), e non ho trovato alcun modo per riscrivere nello stesso punto dove ho letto precedentemente un valore. Ho provato ad utilizzare una ftell prima della lettura, per poi utilizzarlo nella fwrite successiva, ma niente, mi scrive sempre in fondo al file. Vi mostro un esempio di quello che devo fare:

contenuto source.bin:  a2 a4 a7 b2 c5

Il mio programma dovrebbe leggere il 2° elemento, modificarlo e riscrivere il valore modificato (p4) sul file.

contenuto source.bin dopo scrittura: a2 p4 a7 b2 c5

-Si può fare questa cosa? Se si mi sapreste dire una funzione, o libreria che lo permette?


Grazie a tutti, Massimo

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:58
Lunedì, 11/05/2009
p4

?

Stiamo parlando di byte in esadecimale? O cosa ?

Come hai aperto il file? Come hai letto? Come hai scritto?

Devi mostrare il codice ... non mi sembra che sia difficile fare quello che chiedi ...

PM Quote
Avatar
deoiang (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/05/2009

Segnala al moderatore
Postato alle 21:16
Lunedì, 11/05/2009
Grazie per la risposta veloce.

I miei dati sono int che vanno scritti in un file binario.

Ho scritto questo metodo per eseguire la lettura:

//1° parametro indica la posizione dell'elemento (1,2,3,...)
//2° parametro: nome file
int getElx(int pos, char* nomMat)
{    int dr;
    FILE *readF;
    
    
    readF= fopen(nomMat, "r+b");

    fseek (readF, pos, SEEK_SET);
    fread(&dr,sizeof(dr),1,readF);
        
    fclose(readF);
    return dr;
}

Ho scritto questo metodo per eseguire la scrittura:

//1° parametro indica la posizione dell'elemento (1,2,3,...)
//2° parametro: valore da scrivere
//3° parametro: nome file
int writeElx(int pos, int dv,char* nomMat){

    FILE *destinationFile;
    int  dv1;

    long int iPosizione1;
    dv1 =dv;
    
    destinationFile = fopen(nomMat, "a+b");
    size_t bytescritti=0;
    
    iPosizione1 = ftell (destinationFile);
    
        fseek (readF, iPosizione1, SEEK_SET);
        bytescritti= fwrite(&dv1,sizeof(dv1),1,destinationFile);

    fclose(destinationFile);

    return 0; //scrittura ok
    }

La lettura con getElx mi va bene, però la scrittura avviene sempre in coda al file.
Come posso aggiornare solo un elemento e non mettendolo in coda?

Grazie dell'aiuto
    

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:20
Lunedì, 11/05/2009
Se apri il file in append ... per forza ...

Non devi aprire in modo a+b ... ma in r+b

PM Quote
Avatar
deoiang (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/05/2009

Segnala al moderatore
Postato alle 21:24
Lunedì, 11/05/2009
Ok grazie, vedo se funziona,

Molto gentile!

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:26
Lunedì, 11/05/2009
Sì ... ma rivedi bene il codice ... quando scrivi non devi fare la

seek

del file in lettura ma devi usare quello destinazione ...

PM Quote
Avatar
deoiang (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/05/2009

Segnala al moderatore
Postato alle 21:33
Lunedì, 11/05/2009
Si giusto!

Per spostare l'iteratore, per poi usarlo con la fwrite, si usa sempre la fseek? oppure quella vale solo per la lettura?

ciao

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:35
Lunedì, 11/05/2009
Non e' un iteratore ... semmai un puntatore al buffer ...

La seek la usi sia per la lettura, sia per la scrittura ...

Prova, riscrivi il codice e ne parliamo ...

PM Quote