Oppure

Loading
11/05/09 18:22
deoiang
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
aaa
11/05/09 18:58
theprogrammer
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 ...
aaa
11/05/09 19:16
deoiang
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
    
aaa
11/05/09 19:20
theprogrammer
Se apri il file in append ... per forza ...

Non devi aprire in modo a+b ... ma in r+b
aaa
11/05/09 19:24
deoiang
Ok grazie, vedo se funziona,

Molto gentile!
aaa
11/05/09 19:26
theprogrammer
Sì ... ma rivedi bene il codice ... quando scrivi non devi fare la

seek

del file in lettura ma devi usare quello destinazione ...
aaa
11/05/09 19:33
deoiang
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
aaa
11/05/09 19:35
theprogrammer
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 ...
aaa