File sequenziali in C - Lettura
U: il file di testo con l’agenda telefonica salvata Pu: nessuna
Elementi di Informatica
Esempio
Nome variabile Descrizione Tipo Cognome Cognome persona stringa nome Nome persona stringa telefono N.ro telefono persona stringa
Nome variabile Descrizione Tipo
agenda file di testo memorizzante l’agenda File
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
????
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 177
Esempio
Descrizione del metodo di elaborazione:
…. lo studente riporti la descrizione dell’algoritmo da utilizzare
per il programma …
#include <stdio.h> #include <string.h>
void legge(char campo[], int max) // legge una stringa // da tastiera
{ int i = 0; char c;
while ( (c=getchar())!='\n' && (i < max)) {campo[i] = c; i++; } campo[i] = '\0'; }
Esempio - il programma C
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 179
main () { const card=200; int i, riemp; struct persona {char nome[20]; char cogno[20]; char tel[15]; };
struct persona pers[card]; FILE*Fmio; char risp='S'; i=0;
Esempio - il programma C
Elementi di Informatica while (((risp=='S')||(risp=='s'))&&(i<card)) { fflush(stdin); printf("Nome: \n"); legge(pers[i].nome, 20); printf("Cognome: \n"); legge(pers[i].cogno, 20); printf(" Tel. : \n"); legge(pers[i].tel, 20); i++;printf(" Vuoi inserire altre persone? (S/N) "); risp=getchar();
}
riemp=i;
// stampa contenuto array for(i=0;i<riemp;i++) {
printf(" Cognome = %s - ",pers[i].cogno); printf(" Nome = %s - ", pers[i].nome); printf(" Tel = %d \n", pers[i].tel); }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 181
fflush(stdin);
printf(" Vuoi salvare i dati su un file? (S/N) "); scanf("%c", &risp);
if ((risp=='S')||(risp=='s')) { Fmio=fopen("agenda.txt","w");
if (Fmio == NULL)
printf ("Il file non puo essere aperto \n"); else for(i=0;i<riemp;i++) fprintf(Fmio,"%s %s %s\n",pers[i].cogno, pers[i].nome, pers[i].tel); printf("Agenda Salvata \n"); Fclose(Fmio); } else
printf("Agenda non Salvata \n"); }
Esempio - il programma C
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 183
Esempio
Definizione del problema: Scrivere un programma che consente di salvare i
dati di un array monodimensionale di interi in un file sequenziale di testo, salvando nel file anche il valore del riempimento quale primo elemento del file. Calcolare la sommatoria degli elementi dello array.
Copiare i dati salvati nel file in un nuovo array monodimensionale di interi.
Definizione dei dati del problema:
I: gli elementi dello array Pi:nessuna
U: il file di testo con i valori dello array ed il riempimento; lo array ‘caricato’ con i valori nel file, la sommatoria degli elementi dello array
Pu: nessuno
… lo studente definisca tabelle del dizionario dati e descrizione dell’algoritmo ….
Elementi di Informatica
#include<stdio.h> main ( )
{FILE*Fmio;
int i, num, riemp=5, tot=0, riemp2; int vett[]={1,4,7,8,11};
int vett2[15]; int a;
//apre fileint.txt in scrittura Fmio= fopen("fileint.txt","w");
//scrive valore di riemp sul primo rigo del file fprintf(Fmio,"%d\n", riemp);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 185
// scrive i valori di vett sugli altri righi for (i=0;i<riemp;i++)
{ fprintf(Fmio,"%d\n", vett[i]);
// calcola sommatoria elementi array tot=tot+vett[i];
}
printf("tot = %d \n", tot); printf("FINE SALVATAGGIO\n");
fclose(Fmio); //chiude fileint.txt
system("Pause“);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 187
Esempio
Definizione del problema: Scrivere un programma che consente di leggere
dati da un file sequenziale ed inserirli un array monodimensionale di interi. Aggiungere in coda al un file sequenziale nuovi valori uguali al doppio di quelli contenuti nello array.
Definizione dei dati del problema:
I: il file di testo con i valori dello array ed il riempimento Pi:nessuna
U: il nuovo array ‘caricato’ con i valori aggiunti nel file Pu: nessuna
… lo studente definisca tabelle del dizionario dati e descrizione dell’algoritmo ….
Elementi di Informatica
// Carica da file un array di interi con ciclo WHILE
printf("\n\n INIZIO CARICAMENTO \n");
Fmio=fopen("fileint.txt","r"); //apre fileint.txt in lettura
if (!feof(Fmio))
{ i=0;
while (!feof(Fmio)) // cicla fino a fine file
{fscanf(Fmio,"%d", &vett2[i]); // legge valori in vett2
i++; }
printf("FINE CARICAMENTO \n"); }
else printf("RAGGIUNTA FINE FILE");
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 189
printf("\n\n STAMPA VALORI CARICATI IN ARRAY \n\n"); riemp2=i;
for(i=0;i<riemp2;i++) //stampa valori caricati in vett2
printf("vett2[%d]=%d\n",i,vett2[i]);
// Aggiunge altri valori accodandoli alla fine del file
printf("\n\n INIZIA ACCODAMENTO\n\n");
Fmio=fopen("fileint.txt","a"); // apre per accodare
for (i=0;i<riemp2;i++)
{fprintf(Fmio,"\n%d", (vett2[i]*2));
// accoda i valori di vett // moltiplicati per 2;
printf("Valore accodato = %d \n",(vett2[i]*2)); }
printf("\nFINE ACCODAMENTO\n"); fclose(Fmio);
printf("\n\n LEGGE TUTTI I VALORI NEL FILE E LI STAMPA A VIDEO\n");
Fmio=fopen("fileint.txt","r"); //apre fileint.txt in lettura
if (!feof(Fmio)) { i=0;
while (!feof(Fmio)) // cicla fino a fine file
{fscanf(Fmio,"%d", &a); // legge i valori dal file
printf("valore n.ro %d = %d\n",i,a); i++;
} }
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio); //chiude fileint.txt
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 191
... cosa accade in esecuzione ...
Elementi di Informatica
Esempio
Definizione del problema: Scrivere un programma che consente di inserire
in un array i dati di una agenda telefonica, ovvero nome, cognome, e n.ro di telefono di una persona. L’agenda contiene al massimo 200 nomi. Inoltre il programma deve:
• Salvare l’agenda su un file di testo
• Caricare l’agenda dal file in un nuovo array
• Ordinare l’agenda alfabeticamente rispetto al cognome. • Stampare l’agenda prima e dopo l’ordinamento.
• Salvare l’agenda ordinata sul file di testo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 193
Esempio
... Lo studente definisca il dizionario dei dati e l’algoritmo che intende usare ...
#include <stdio.h> #include <string.h> typedef struct {char nome[20]; char cogno[20]; char tel[15]; } PERSONA;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 195
// prototipo procedure per leggere una stringa da tastiera
void legge(char campo[], int max);
// prototipo procedure per immettere i dati nello array di struct
void riempiarraystruct(PERSONA pers[],int *riemp, int card);
// prototipo procedure per stampare lo array di struct
void stampaarraystruct(PERSONA pers[], int riemp);
// prototipo della procedure per ordinare lo array di struct
void ordinaAgenda(PERSONA person[], int card);
// prototipo procedure per salvare il contenuto dello array di // struct in un file di testo
void scrivifile(int riemp, PERSONA pers[]):
// prototipo procedure per riportare il contenuto di un file
// sequenziale in un array di struct
void leggifile(int riemp, PERSONA pers2[]);
Elementi di Informatica
main ()
{const card=200; int i, riemp;
PERSONA persone[card]; //persone: array di struct da // salvare su file di testo PERSONA persone2[card]; //persone2: array di struct da
// caricare dal file di testo char risp='S';
// inserimento dati nello array persone riempiarraystruct(persone, &riemp, card); // stampa contenuto array persone
stampaarraystruct(persone, riemp);
printf(" Vuoi salvare i dati su un file? (S/N) "); scanf("\n%c", &risp);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 197
if ((risp != 'S')||(risp != 's'))
printf("Agenda non Salvata!! FINE PROGRAMMA \n"); else
{scrivifile(riemp, persone); //salva array sul file di testo //Carica persone2 leggendo dal file i dati dell’agenda leggifile(riemp, persone2);
// stampa contenuto array persone2 stampaarraystruct(persone2, riemp);
// ordina contenuto array persone2 e lo salva sul file ordinaAgenda(persone2, riemp);
scrivifile(riemp, persone2);
printf("\n\n STAMPA AGENDA ORDINATA \n\n"); stampaarraystruct(persone2, riemp);
}
system("Pause"); }
// procedura per leggere una stringa da tastiera void legge(char campo[], int max)
{ int i = 0; char c;
while ((c=getchar())!='\n' && (i < max)) {campo[i] = c;
i++; }
campo[i] = '\0'; }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 199
// procedure per immettere i dati nello array di struct
void riempiarraystruct(PERSONA pers[],int *riemp, int card) { char risp='S'; int i=0; while (((risp=='S')||(risp=='s'))&&(i<card)) { fflush(stdin); printf("Nome: \n"); legge(pers[i].nome, 20); printf("Cognome: \n"); legge(pers[i].cogno, 20);
printf(" Tel. : \n"); legge(pers[i].tel, 15); i++;
printf(" Vuoi inserire altre persone? (S/N) "); risp=getchar();
}
*riemp=i; }
Elementi di Informatica
// procedure per stampare lo array di struct
void stampaarraystruct(PERSONA pers[], int riemp) {int i;
for(i=0;i<riemp;i++)
{ printf(" Cognome = %s - ",pers[i].cogno); printf(" Nome = %s - ", pers[i].nome); printf(" Tel = %s \n", pers[i].tel); }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 201
void ordinaAgenda(PERSONA person[], int card)
// ordina lo array di struct contenente i dati della agenda
{PERSONA swap; int i, k; for(i=0;i<card-1;i++) for(k=i;k<card;k++) { if(strcmp(person[i].cogno,person[k].cogno)>0) { swap=person[i]; person[i]=person[k]; person[k]=swap; } }
void scrivifile(int riemp, PERSONA pers[])
//salva il contenuto dello array di struct in un file di testo
{FILE *Fm; int i;
Fm = fopen("agenda.txt","w"); if (Fm == NULL)
printf ("Il file non puo’ essere aperto \n"); else { for(i=0;i<riemp;i++) fprintf(Fm,"%20s %20s %15s\n",pers[i].cogno, pers[i].nome, pers[i].tel); printf("Agenda Salvata \n"); fclose(Fm); } }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 203
void leggifile(int riemp, PERSONA pers2[])
{//Caricacontenuto del file sequenziale in un array di struct FILE *Fmio;
int i;
printf("\n\n LEGGE DAL FILE E CARICA IN ARRAY \n\n"); Fmio=fopen("agenda.txt","r"); if (!feof(Fmio)) { i=0; do {fscanf(Fmio,"%20s %20s %15s", &pers2[i].cogno, pers2[i].nome, &pers2[i].tel); i++; } while (!feof(Fmio)); printf("FINE CARICAMENTO\n"); }
else printf("RAGGIUNTA FINE FILE"); fclose(Fmio);
}
Definizione del problema:
Scrivere un programma per gestire le seguenti operazioni da eseguirsi sui dati di una agenda telefonica memorizzata in un file di testo:
• Creazione dell’agenda ed inserzione in essa del cognome, nome e numero di telefono di una persona
• Stampa/visualizzazione del contenuto della agenda • Aggiunta di nuovi nomi nell’agenda
• Ricerca dei dati di una persona fornendone il cognome
• Cancellazione di un contatto nell’agenda fornendone il cognome • Ordinamento della agenda in modo crescente rispetto al cognome
... Con sottoprogrammi ...