Ciao!
Ho provato a modificare il programma facendo in modo che possa acquisire anche numeri dall'utente. Questi vengono memorizzati nel file ingresso.txt e suddivisi da un return ("\n"). Il problema ora è che feof() legge una volta di troppo i valori (perchè scandaglia anche la nuova riga vuota), segnala una riga in più di quella che dovrebbe esserci e, stranamente, somma due volte l'ultimo valore (mi sfugge il perchè). Ho ovviato a questo inconveniente facendo:
Esiste una soluzione più elegante?codice:nrLines--; sum -= value;
Qualcuno può spiegarmi il perchè dell'aggiunta dell'ultimo valore?![]()
Grazie!![]()
Segue il sorgente completo
codice:#include <stdio.h> #include <stddef.h> #include <stdlib.h> #define MAX 20 #define FILE_INPUT "ingresso.txt" #define FILE_OUTPUT "uscita.txt" int main(){ //variabili int choose = 0; //Prototipi void scriviRis(void); void addNumbers(void); void deleteNumbers(void); while(choose < 3){ puts("Che cosa si desidera fare?"); puts("1) Inserire numeri sul file"); puts("2) Scrivere la somma dei numeri sul file"); puts("Premere un qualunque altro tasto per uscire dal programma"); puts("-------"); printf("Scelta: "); scanf("%d", &choose); switch(choose){ case 1: //inserisco una nuova riga sul file FILE_INPUT addNumbers(); break; case 2: //scrivo il risultato in FILE_OUTPUT scriviRis(); break; default: printf("Bye!\n"); } //Svuoto il buffer dello standard input fflush(stdin); puts("-------"); } return(0); } void addNumbers(void){ // Puntatori ai file FILE *in; // Numero da inserire float num; // Apro il file FILE_INPUT in lettura e associo il suo indirizzo a un puntatore if(!(in = fopen(FILE_INPUT, "a"))){ printf("Impossibile aprire il file di input."); exit(-1); } else { printf("Scrivi il numero da inserire sul file: "); scanf("%f", &num); //Scrivo il numero inserito dall'utente fprintf(in, "%.2f\n", num); //chiudo il canale ai file fclose(in); puts("Scrittura del numero su file eseguita correttamente"); } } void scriviRis(void){ //Puntatori ai file FILE *in, *out; //array che contiene i caratteri estratti char line[MAX]; float value = 0, sum = 0; int nrLines = 0; //Apro il file FILE_INPUT in lettura e associo il suo indirizzo a un puntatore if(!(in = fopen(FILE_INPUT, "r"))){ printf("Impossibile aprire il file di input."); exit(-1); } else { //Apro il file FILE_OUTPUT in scrittura dalla coda. Se non esiste lo crea. if(!(out = fopen(FILE_OUTPUT, "a"))){ printf("Impossibile aprire il file di output."); exit(-1); } else { //scorre il file fino alla fine while(!(feof(in))){ //prelevo una linea di massimo MAX caratteri dall'input fgets(line, MAX, in); //estraggo il valore reale contenuto nella linea value = atof(line); //faccio la somma dei valori che di volta in volta estraggo sum += value; //incremento il numero di linee presenti nel file nrLines++; } //Decremento di uno il numero delle righe. Infatti l'ultima riga viene letta anche se vuota nrLines--; sum -= value; //Scrivo su file FILE_OUTPUT fprintf(out, "Il file di origine contiene al momento %d numeri aventi somma %.2f\n", nrLines, sum); //chiudo il canale ai file fclose(in); fclose(out); puts("Scrittura su file eseguita correttamente"); } } }

Rispondi quotando