PDA

View Full Version : [C] Problema con programma che "scambia" caratteri


kierlo
21-05-2010, 19:07
Ho bisogno di un programma che mi legga un file e che mi cambi le virgole in punti. Su un libro che uso per l'uni dice di usare file in formato ".dat".

ecco il codice che ho scritto (può essere sbagliato alla grande,dato che a lezione le operazioni sui file non le abbiamo mai fatte):


#include<stdio.h>
#include<stdlib.h>


int main ( int argc, char *argv[]) {
int c;

FILE * fp;
fp=fopen(argv[1],"w");
if(fp==NULL)
printf("Nome file inserito non valido\n");
else
printf("Apertura del file \"%s\"......\n",argv[1]);
do{
c=getc(fp);
putchar(c);
if (c=='.')
c=',';
putc(c,fp);
}
while ( c != EOF);
fflush(fp);
fclose(fp);
printf("\n");
exit(EXIT_SUCCESS);
}



l'indirizzo del file in input lo riceve con la chiamata del programma (uso linux).
Ho provato a farlo con le liste concatenate ma ho lo stesso problema.
Ringrazio in anticipo

Kenger
21-05-2010, 20:02
E il problema quale sarebbe? :P

PS. Indenta il codice.

deadlyomen17
21-05-2010, 20:25
le estensioni sono solo un buon modo per dare una informazione veloce del contenuto del file...non sono strettamente necessarie.
potresti chiamare il tuo file anche .zip o .mp3 o senza alcuna estensione...resterebbe comunque un file di testo.

tornando al tuo problema...il tuo codice non può funzionare per molti motivi...
intanto la funzione fopen col parametro "w" apre un file in scrittura; in particolare se il file da aprire esiste, questo viene svuotato

come puoi vedere qui -> C++ Reference - fopen (http://www.cplusplus.com/reference/clibrary/cstdio/fopen/)

ovviamente nel file non leggi nulla, non solo perchè è stato svuotato, ma perchè la modalità "w" non prevede la lettura, ma solo la scrittura.

per la lettura di un file devi aprirlo in modalità "r" oppure "r+" o "w+" per consentire scrittura e lettura (maggiori dettagli li trovi nel link di sopra).

per i tuoi scopi la cosa più semplice da fare è aprire il file in lettura, salvarsi il suo contenuto in un array di char, e chiuderlo.

scorrere l'array e sostituire ogni ',' con '.'

aprire il file in scrittura e scriverci tutto l'array

fero86
22-05-2010, 02:38
per i tuoi scopi la cosa più semplice da fare è aprire il file in lettura, salvarsi il suo contenuto in un array di char, e chiuderlo.

scorrere l'array e sostituire ogni ',' con '.'

aprire il file in scrittura e scriverci tutto l'array a che serve l'array intermedio? si tratta solo di sostituire ogni istanza di un certo carattere con un altro, puó anche riscrivere i caratteri man mano che li legge.

kierlo
22-05-2010, 08:00
avevo provato anche con w+ ma il risultato era lo stesso.
Avevo iniziato a farlo con delle liste concatenate, vedo come funziona con quelle allora.
Il problema è che dopo che un file viene "usato" dal programma diventa illeggibile, in quanto gedit non riesce a trovare una codifica caratteri idonea.
Questo per quale motivo?

deadlyomen17
22-05-2010, 09:16
a che serve l'array intermedio? si tratta solo di sostituire ogni istanza di un certo carattere con un altro, puó anche riscrivere i caratteri man mano che li legge.

ti invito a rileggere quanto ho scritto: per i tuoi scopi, la cosa più SEMPLICE da fare ...

è ovvio che la semplice sostituzione di caratteri si può fare in altri modi sicuramente più efficienti, ma visto che è evidente che kierlo è alle prime armi o quasi con C, credo sia meglio che capisca per bene la logica di programmazione e non come ottimizzare.

avevo provato anche con w+ ma il risultato era lo stesso.
Avevo iniziato a farlo con delle liste concatenate, vedo come funziona con quelle allora.
Il problema è che dopo che un file viene "usato" dal programma diventa illeggibile, in quanto gedit non riesce a trovare una codifica caratteri idonea.
Questo per quale motivo?

diventa illegibile perchè il tuo programma lo "usa" male.

se provi a fare un programma che fa una scrittura normale (usando ad esempio fputc) vedrai che non c'è alcun problema di codifica caratteri.

se vuoi fare tutto in un unica passata, devi aprire il file in modalita "r+", la modalità "w+" prevede lo svuotamento del file.

fero86
22-05-2010, 14:19
ti invito a rileggere quanto ho scritto: per i tuoi scopi, la cosa più SEMPLICE da fare ... molto opinabile direi.

deadlyomen17
22-05-2010, 14:42
molto opinabile direi.

ogni opinione è opinabile ;)

presenta anche la tua così se ne discute

potremmo presentargli una soluzione che in un unico ciclo legge ed eventualmente sostituisce il carattere ',' con '.'

potremmo fargli caricare il file in memoria di colpo, e non leggerlo carattere per carattere, aumentando la velocità...

ci sono tante soluzioni! quella era a mio avviso la più semplice e/o intuitiva..ma potrei essermi sbagliato ovviamente

kierlo
22-05-2010, 18:42
ti invito a rileggere quanto ho scritto: per i tuoi scopi, la cosa più SEMPLICE da fare ...

è ovvio che la semplice sostituzione di caratteri si può fare in altri modi sicuramente più efficienti, ma visto che è evidente che kierlo è alle prime armi o quasi con C, credo sia meglio che capisca per bene la logica di programmazione e non come ottimizzare.



diventa illegibile perchè il tuo programma lo "usa" male.

se provi a fare un programma che fa una scrittura normale (usando ad esempio fputc) vedrai che non c'è alcun problema di codifica caratteri.

se vuoi fare tutto in un unica passata, devi aprire il file in modalita "r+", la modalità "w+" prevede lo svuotamento del file.

Eh avevo provato con putc, ma il problema probabilmente è +w invece di r+!
domani provo che ora non ho tempo.. Grazie mille per gli aiuti!

deadlyomen17
22-05-2010, 19:25
Eh avevo provato con putc, ma il problema probabilmente è +w invece di r+!
domani provo che ora non ho tempo.. Grazie mille per gli aiuti!

ti anticipo di fare attenzione al fatto che la funzione fgetc oltre a restituirti il carattere letto, si sposta in avanti nel file.
quindi se fai fgetc e dopo fputc, il risultato non è la sostituzione del carattere letto con il nuovo, bensì la sostituzione del carattere successivo a quello letto con il nuovo...

kierlo
23-05-2010, 19:20
ma per crear un nuovo file basta fare
fp=fopen("nomefile",r+);
per aprilo anche in scrittura(con fp puntatore a file)?

Conviene a questo punto non mischiare le cose..tanto non ho la necessità che sia lo stesso file modificato, mi basta averne uno con soli punti..

deadlyomen17
23-05-2010, 19:56
ma per crear un nuovo file basta fare
fp=fopen("nomefile",r+);
per aprilo anche in scrittura(con fp puntatore a file)?


se usi "r+" il file deve esistere

"r+" - Open a file for update both reading and writing. The file must exist.

per creare un file bisogna aprirlo in scrittura con "w" o "w+" oppure aprirlo in modalità "appending" con "a+"

Conviene a questo punto non mischiare le cose..tanto non ho la necessità che sia lo stesso file modificato, mi basta averne uno con soli punti..

dipende dal significato di "conviene", sicuramente a mo di esercizio va bene qualsiasi cosa basta che funzioni bene e sia chiara.