ESEMPI ED ESERCIZI LEZIONE 9: FILE Scrivere un programma
Transcript
ESEMPI ED ESERCIZI LEZIONE 9: FILE Scrivere un programma
ESEMPI ED ESERCIZI LEZIONE 9: FILE Scrivere un programma che: 1. 2. 3. 4. apra un file binario in lettura o scrittura (esempio) apra un file e ci scriva sopra (esempio) acceda ad un file binario in modo random (esempio) riceva come parametro il nome del file e stampi la media dei voti ottenuti dagli studenti e il cognome e voto dello studente con il voto più alto. Se più studenti hanno ottenuto lo stesso voto massimo, la funzione restituisce il primo (esercizio) 5. calcoli dei numeri casuali (esempio) Esempio 1 /*apre un file in tipo testo o tipo binario.*/ #include<stdio.h> main() { FILE *fp; char filename[40], mode[4]; int ch; while(1) { printf("\n Inserisci il nome del file:"); gets(filename); printf("\n Inserisci il tipo di file: (max 3 caratteri)"); gets(mode); if ((fp=fopen(filename,mode))!= NULL){ printf("\n Apertura del file %s di tipo %s avvenuta con successo.\n",filename, mode); fclose(fp); puts("Inserisci x per uscire, o un altro carattere per continuare"); if ((ch=getchar())=='x') break; else continue; } else { fprintf(stderr,"\n Errore nell'apertura del file %s di tipo %s:", filename,mode); puts("Inserisci x per uscire, o un altro carattere per continuare"); if ((ch=getchar())=='x') break; else continue; } } } Esempio 2 /*legge da e scrive su un file di tipo binario.*/ #include<stdio.h> #include<stdlib.h> #define SIZE 20 main() { FILE *fp; int count, array1[SIZE], array2[SIZE]; for (count=0; count<SIZE; count++) array1[count]= 2* count; /*Apri il file in modalita' binario*/ if((fp=fopen("direct.txt","wb"))==NULL) { fprintf(stderr,"Errore di apertura del file:"); exit(1); } /*Salva array1 sul file*/ if(fwrite(array1,sizeof(int),SIZE,fp)!= SIZE) { fprintf(stderr,"\n Errore di scrittura sul file"); exit(1); } fclose(fp); /*apri il file in modalita' binaria in lettura*/ if((fp=fopen("direct.txt","rb"))==NULL) { fprintf(stderr,"Errore di apertura del file:"); exit(1); } if(fread(array2,sizeof(int),SIZE,fp)!= SIZE) { fprintf(stderr,"\n Errore di lettura dal file"); exit(1); } fclose(fp); for (count=0; count<SIZE; count++) printf("%d \t %d\n", array1[count],array2[count]); } Esempio 3 /*accesso random ad un file di tipo binario.*/ #include<stdio.h> #include<stdlib.h> #include<io.h> #define MAX 50 main() { FILE *fp; int count, data, array[MAX]; long offset; for (count=0; count<MAX; count++) array[count]= 10* count; if((fp=fopen("random.dat","wb"))==NULL) { fprintf(stderr,"Errore di apertura del file:"); exit(1); } if(fwrite(array,sizeof(int),MAX,fp)!= MAX) { fprintf(stderr,"\n Errore di scrittura sul file"); exit(1); } fclose(fp); if((fp=fopen("random.dat","rb"))==NULL) { fprintf(stderr,"Errore di apertura del file:"); exit(1); } while(1) { printf("\n Inserisci quale elemento vuoi leggere nel file, tra 0-%d, oppure -1 per uscire",MAX-1); scanf("%ld",&offset); if (offset<0) break; else if (offset > MAX-1 ) continue; if ((fseek(fp,offset*sizeof(int), SEEK_SET))!=NULL) { fprintf(stderr,"\n Errore nell'utilizzo di fseek()"); exit(1); } fread(&data,sizeof(int),1,fp); printf("l'elemento %ld ha valore %d",offset,data); } fclose(fp); } Esercizio 4 /*determina lo studente che ha ottenuto una votazione massima e calcola la media dei voti registrati in un file di testo*/ #include <stdio.h> #include <stdlib.h> #include<string.h> void media(char *nomefile); main() /*non richiesta*/ { media("voti.txt"); } void media(char *nomefile) { FILE *fp; char studente[21], best[21],ch; int numStud, voto, votomax; float media; quanti=votomax=0; if ((fp=fopen(nomefile,"r"))==NULL) { printf("Il file %s non esiste",nomefile); exit(1); } while(fscanf(fp,"%c",&ch)!=EOF) { if( ch=='(' ) { fscanf(fp,"%s %d %*c",studente,&voto); media+=voto; ++numStud; if(voto > votomax) { strcpy(best,studente); votomax=voto; } } } fclose(fp); printf("\nLa media dei voti e':%f",media/numStud); printf("\nLo studente che ha ottenuto il voto piu' alto (%d) e':%s",votomax,best); } Esempio 5 #include<stdio.h> #define FATTORE 25173 #define MODULO 65535 #define INCREMENTO 13849 #define SEME_INIZIALE 8 #define LOOP 10 unsigned rand(void); main() { int i; for (i=0;i<LOOP;i++) printf(“il numero casuale %d e’ } %6u\n\n”,i+1, rand()); unsigned rand(void) { static unsigned seme=SEME_INIZIALE; seme= (FATTORE*seme+INCREMENTO)%MODULO; return(seme); }