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);
}