Newsgroup: it.comp.lang.c
Titolo: Sostiruire caratteri all'interno di un file...

Ciao a tutti,
scusate per la domanda molto probabilmente banale,
ma da sola non ci riesco e spero in qualche utile suggerimento...
Ho un file di testo e devo sostituire un carattere con un altro,
per esempio devo sostituire tutte le 'a' con delle 'h'...
Avevo pensato a questo soluzione, ma mi da dei problemi e non capisco bene 
perchè non vada bene, a me sembra che un certo senso ce l'abbia... ma la 
realtà dice il contrario...
req è un puntatore a una struttura in cui ho il nome del file (nome), e i 
due caratteri, quello da cercare (char1) e quello nuovo (char2)...
if (fd=open(req->nome,O_RDWR)<0) {
    printf("\nImpossibile aprire il file");
    res = -1;
}
else {
    while((c=fgetc(fd))!=EOF) {
        if (c==req->char1) {
            fwrite(req->char2, -1, 1, fd);
        }
}
Grazie in anticipo a tutti,
CAMI. 

             fwrite(req->char2, -1, 1, fd);
questa mica l'ho capita...
Hai guardato il prototipo di fwrite?
size_t fwrite(
	const void *buffer,
	size_t size,
	size_t count,
	FILE *stream
);
quindi tu dovresti fare qualcosa tipo
fwrite( &(req->char2), sizeof(char), 1, fd );

 CAMI.
Ciao

 fread( buffer, file_length, 1, fd );
... ma quel file_length,e standard?
esiste solo in linux? mai visto! :-)
sul k&r non c'č!?
Ciao

 Ciao
No vabè che c'entra.. volevo evitare di scrivere tutto tutto tutto :)
Ovviamente sarà qualcosa tipo:
long file_length;
char * buffer;
..
fseek( fd, 0, SEEK_END );
file_length = ftell(fd);
fseek( fd, 0, SEEK_SET );
buffer = malloc( file_length );
...
free( buffer );
Per le discussioni sul fatto che questo metodo restituisca o meno
correttamente la dimensione del file googla su questo gruppo :)
Ciao
Mtc

 poi lo riscrivi
Se il file e` aperto in modalita` binaria e la sostituzione avviene con
dati della stessa dimensione (in questo caso un char al posto di un
char) allora dovrebbe essere possibile farlo in-place.
if (c == req->char1) {
        fseek(fd, -1, SEEK_CUR);
        fputc(req->char2);
}
Se il file e` aperto in modo testo e` possibile farlo mettendo delle
condizioni piu` strette su cosa viene sostituito, evitando caratteri che
vengono espansi in sequenze diverse. Sarebbe inoltre impossibile passare
direttamente l'offset a fseek, quindi bisognerebbe fare una cosa del
genere:
long int last = ftell(fd);
for(...) {
        if (c == req->char1) {
                fseek(fd, last, SEEK_CUR);
                fputc(req->char2);
        }
        last = ftell(fd);
}
Una cosa oscena quindi :P
Luca
-- 
Home: 
http://kronoz.cjb.net
I went to God just to see
And I was looking at me
Saw heaven and hell were lies
When I'm God everyone dies

 Una cosa oscena quindi :P
Sì lo è :).. ma mi sfugge una cosa. Dici che è impossibile passare
l'offset a fseek() per motivi che mi sfuggono, tuttavia usi fseek() con
SEEK_CUR e un valore sempre positivo ritornato da ftell() che porterebbe a
finire anzitempo lo scorrimento del file..
Ciao
M?

 
Mi sfugge il ragionamento che sta sotto a questo codice..
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 Ovviamente sarà qualcosa tipo:
....
... ah va beh , ...allora, non volevo scocciare ;-)
Ciao

 finire anzitempo lo scorrimento del file..
Lo standard prescrive che la fseek sui file di testo possa essere usata
solo con un offset pari a zero oppure passando un valore precedentemente
ottenuto con una ftell insieme a SEEK_SET. In pratica fseek puo` essere
usata solo per tornare in un punto precedentemente salvato con ftell e
non per l'accesso diretto.
In questo caso particolare potrebbe anche funzionare visto che abbiamo
posto la restrizione su quale puo` essere il carattere da sostituire, ma
sarebbe un comportamente non garantito dallo standard.
Luca
-- 
Home: 
http://kronoz.cjb.net
Il coraggio non mi manca.
E` la paura che mi frega...