|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1360
|
[C] Lettura e scrittura di File Testo
Salve ragazzi.
Sto scrivendo un semplice algoritmo ed in esso devo leggere delle stringhe da tastiera, memorizzarle in un file testo e poi ristamparle a video. Per memorizzare le stringhe ho usato il codice seguente: ----------------------------------------------------------------------- for(i=0;i<n;i++) { printf("Inserisci la stringa numero %d:\n", i+1); while((ch=getchar()) != EOF) fprintf(fp,"%c", ch); } ---------------------------------------------------------------------- Però non riesco a trovare il modo di leggere da questo file. Ho provato in molti modi ma ottengo solo una à. Il file l'ho aperto con il comando a+ in modo da poterci appendere e leggere. Aspetto vostre illuminazioni... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Fammi capire...ma il file se lo apri con notepad come lo vedi ?
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
|
aspè che ci provo anchio dato che devo imparare a leggere i file di testo
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#4 | ||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16209
|
Re: [C] Lettura e scrittura di File Testo
Quote:
![]() ![]() ![]() Codice:
fputc(ch,fp); Codice:
printf("Inserisci la stringa numero %d:\n", i+1); while (1) { fputc(fp,(ch=getchar())); if (ch=='\n') break; } Se vuoi potergli assegnare il valore EOF, deve essere int. Quote:
Esegui una rewind(fp) tra il momento in cui scrivi l'ultimo carattere e quello in cui provi a leggere il file. Per leggere... beh, guarda che leggere righe di testo di lunghezza arbitraria non e' facile come sembra... puoi stampare tutto il file semplicemente leggendolo un carattere alla volta, e stampando il carattere appena letto.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 |
||
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Io eviterei l'uso di EOF...ma userei feof...
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
|
orca sbaglio qualcosa
![]() Codice:
while (!feof(fp)){ fgets (&x, 1, fp); printf ("%c", x); }
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1360
|
Re: Re: [C] Lettura e scrittura di File Testo
Quote:
>Cionci: -Se apro il file testo creato ci sono i caratteri che immetto quindi li scrive bene. -Scusa l'ignoranza ma cosa cambia fra eof e feof? >ZioSilvio: -Perchè non usare la fprintf? Che problemi porterebbe? -ch l'ho dichiarato come intero. -Nel tuo codice sopra riportato la fputc mi sembra che abbia i parametri al contrario. Comunque l'esercizio mi chiede di usare le funzioni fscanf, fprintf, getc e putc. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Lo standard prevede di usare feof...e questo vuol dire che il metodo con EOF possa non funzionare con tutti is sitemi operativi...
feof è una funzione... che prende come parametro un FILE * e ritorna un numero diverso da 0 se è stata raggiunta la fine del file... |
![]() |
![]() |
![]() |
#9 | ||||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16209
|
Re: Re: Re: [C] Lettura e scrittura di File Testo
Quote:
Se fai molte chiamate, usare fputc anziché fprintf velocizza il programma. Quote:
Quote:
Codice:
fputc((ch=getchar()),fp); ![]() Mi sa che sto diventando ![]() ![]() Chiedo scusa. Quote:
Hai più provato a mettere rewind prima delle fscanf? Dà ancora quell'output strano?
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 Ultima modifica di Ziosilvio : 06-09-2004 alle 21:03. |
||||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Giusto se apri con a+t: fseek(f, 0, SEEK_SET);
|
![]() |
![]() |
![]() |
#11 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16209
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 |
|
![]() |
![]() |
![]() |
#12 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16209
|
Quote:
Codice:
rewind(fp); Codice:
fseek(fp,0L,SEEK_SET); clearerr(fp);
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1360
|
>Cionci:
L'apertura file a+t cosa produce? Io ho usato la a+. Per quanto riguarda le scrittura delle stringhe su file va bene poichè il file testo generato riporta quello che digito. Ora non mi è molto chiaro il funzionamento della fscanf. Ho provato il seguente codice ma di sicuro c'è qualcosa di sbagliato perchè mi restituisce "!!". Ah ho inserito rewind fp fra le operazioni di lettura e scrittura ma non è quello il problema...o almeno non solo quello ![]() ------------------------------------------------------------------- for(j=0;j<len;j++) { fscanf(fp, "&d", &s); putchar(s); } ------------------------------------------------------------------- s è un intero con len indico la lunghezza del file, ma ho un dubbio. E' corretto calcolare len in questo modo? ------------------------------------------------------------------- len=0; while((ch=getchar()) != EOF) fprintf(fp,"%c", ch); len++; ------------------------------------------------------------------ Qualcuno sa dove posso trovare qualche spiegazione sulla scanf perchè ho trovato poco sinora. Ultima modifica di fant3 : 06-09-2004 alle 21:44. |
![]() |
![]() |
![]() |
#14 | |||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16209
|
Quote:
Codice:
int fscanf(FILE *stream, const char *fmt, ...); fscanf(fp,fmt,arg1[,arg2,...]) legge dal file fp una sequenza di caratteri corrispondente alla stringa di formato fmt. Ogni volta che in fmt c'è una sequenza del tipo "%t", legge la sequenza successiva come se fosse una rappresentazione di un oggetto di tipo t, e lo scrive nella zona di memoria puntata dall'argN corrispondente. Per esempio: Codice:
fscanf(stdin,"%d",&n); Quote:
Devi racchiudere la fprintf e il len++ tra parentesi graffe. In alternativa, puoi usare la forma idiomatica: Codice:
for (len=0; (ch=getchar()) != EOF; len++) fprintf(fp,"%c",ch); La svista è che i formattatori iniziano con % e non con &: così è come se tu gli avessi chiesto "leggi da fp un carattere & e un carattere d". L'errore concettuale è che il formattatore %d significa una stringa che rappresenta un numero intero in notazione decimale, quindi una fscanf(pf,"%d",&s) comincia a leggere da fp un carattere dopo l'altro finché: - o incontra una lettera, e allora capisce che c'è qualcosa che non va, rimette l'ultimo carattere letto al suo posto nel file, non altera il contenuto di s, e restituisce 0; - oppure incontra una cifra, nel qual caso continua a leggere finché ci sono cifre, aggiorna il contenuto di s col valore che ha trovato, e restituisce 1. Se, come ho capito, devi semplicemente stampare il file su schermo, una fscanf come la tua va bene, ma s deve essere di tipo char e il formattatore deve essere %c. Quote:
E, naturalmente, nel manuale del compilatore (o nelle man pages di Linux).
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 Ultima modifica di Ziosilvio : 06-09-2004 alle 23:12. |
|||
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Il K&R è un po' vecchio come manuale...
Io sinceramente non mi affiderei molto su EOF...poi fate vobis... Riguardo al mettere la t dopo il modo di apertura (lo puoi fare per qualsiasi modalità): t sta per text b sta per binary Il default è t, ma in teoria è possibile modificare la modalità di apertura di default...quindi se uno vuole essere sicuro è meglio specificare... Ultima modifica di cionci : 06-09-2004 alle 23:53. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1360
|
grazie ZioSilvio per i consigli.
Effettivamente ieri avevo confuso i % con & ed avevo mancato le graffe nel ciclo di scrittura....sarà stata l'ora tarda a farmi sbagliare ![]() Ora va tutto bene, il file viene scritto e letto correttamente. Visto che l'esercizio vuole il tutto sotto forma di function di tipo void. Ho provato passando cosi': text(fp, &len, n) void text(FILE *fp, int *dim, int n) ma credo sia sbagliato perchè quando provo ad aprire manualmente il file testo c'è quello che scrivo, ma quando eseguo l'algoritmo non legge nulla. Forse sbaglio nel passaggio del file testo vero? Ultima modifica di fant3 : 07-09-2004 alle 11:08. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1360
|
Ok ragazzi ho risolto.
void text(FILE *fp, int *dim, int n) text(fp, &len, n) Prima non funzionava perchè non leggeva la lunghezza del file. Ho messo una variabile locale nella funzione che legge la lunghezza e poi alla fine la memorizza nel puntatore da passare al main. Grazie a tutti per l'aiuto siete stati gentilisismi. ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:36.