fprintf(fileNomi,"%s", nome); // scrive il valore della stringa della // variabile nome in Nomi.txt ... ...
fclose (fileNomi);
File sequenziali in C - Lettura
Lettura da file:
fscanf(<nome_puntatore_file>, <formato_dati>, &<nomi_variabili>)
Assegna a <nomi_variabili> il/i valore/i letti nel file puntato da
<nome_puntatore_file> secondo il <formato_dati>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in lettura ... ...
fscanf(fileNomi,"%s", &nome); // legge una stringa in Nomi.txt e assegna // il valore letto alla variabile nome ... ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 129
File sequenziali in C
Funzione feof(<nome_puntatore_file>)
permette di verifcare se si è raggiunta la fine del file puntato da <nome_puntatore_file>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in lettura ... ... fscanf(fileNomi,"%s",&nome); if (!feof(FileNomi)) { ... ... fscanf(fileNomi,"%s",&nome); ... ... } fclose (fileNomi);
File sequenziali in C: un programma di esempio #include <stdio.h>
#include <string.h> main ()
// Salva nomi in un file di testo {char nome[20];
int conta=0; //conta quanti nomi sono immessi
FILE *Fnomi; char risp ='S';
//apertura file Nomi.txt in scrittura Fnomi=fopen("Nomi.txt","w");
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 131
File sequenziali in C: un programma di esempio // verifica che il file esiste su memoria massa if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n"); else
{ while ((risp=='S')||(risp=='s')) {printf("Nome: \n");
fflush(stdin); // svuota buffer input
gets(nome);
// scrive sul file il nome digitato fprintf(Fnomi,"%s \n",nome);
conta++;
printf("Vuoi inserire altri nomi?(S/N)"); scanf(“c",&risp);
}
}
File sequenziali in C: un programma di esempio
//chiusura del file Nomi.txt fclose(Fnomi);
printf("\nInseriti %d nomi nel file\n", conta);
system("Pause"); }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 133
File sequenziali in C: un programma di esempio
File sequenziali in C: un programma di esempio #include <stdio.h>
#include <string.h>
main () // Legge i nomi dal file e li visualizza { int conta = 0;
char nome[20]; FILE*Fnomi;
Fnomi=fopen("Nomi.txt","r"); //apre file in lettura if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n"); else { do { fscanf(Fnomi,"%20s\n", &nome); puts(nome); conta++;} while (!feof(Fnomi)); } fclose(Fnomi);
printf("\nLetti %d nomi dal file\n", conta); system("Pause");
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 135
File sequenziali in C: un programma di esempio #include <stdio.h>
#include <string.h> main ()
// Legge nomi da file e li carica in un array
{ int conta = 0, i;
struct nomi_str //struct con un solo campo come tipo {char nome_str[20];}; //base per lo array arr_nomi
// arr_nomi[50] è un array di struct per realizzare lo array di // stringhe in cui caricare i nomi letti dal file di testo
struct nomi_str arr_nomi[50]; FILE *Fnomi;
Fnomi=fopen("Nomi.txt","r"); //apre in lettura il file Nomi.txt
if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n"); else
{ while (!feof(Fnomi)) //carica in arr_nomi le
{fscanf(Fnomi,"%20s\n", &arr_nomi[conta].nome_str); conta++;} } File sequenziali in C: un programma di esempio printf("\n\nARRAY NOMI \n"); for(i=0;i<conta;i++) printf("arr_Nomi[%d]=%s\n",i, arr_nomi[i].nome_str); fclose(Fnomi); system("Pause"); }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 137
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. 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
.... Usando sottoprogrammi ....
Esempio
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 139
#include <stdio.h> #include <string.h> typedef struct {char nome[20]; char cogno[20]; char tel[15]; } PERSONA;
// legge 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'; }
// prototipo della procedure per ordinare lo array di struct
void ordinaAgenda(PERSONA person[], int card);
// 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();
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 141
// 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); }
}
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 143
void leggifile(int riemp, PERSONA pers2[])
{ // Carica il contenuto 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);
}
main ()
{const card=200; int i, riemp;
PERSONA pers[card]; //array di struct da salvare su file di testo
PERSONA pers2[card]; //array di struct da caricare dal file //di testo
char risp='S';
// inserimento dati nello array pers riempiarraystruct(pers, &riemp, card); // stampa contenuto array pers
stampaarraystruct(pers, 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 145
if ((risp=='S')||(risp=='s'))
scrivifile(riemp, pers); // salva array pers sul file di testo else
printf("Agenda non Salvata \n");
//Carica lo array pers2 leggendo dal file di testo i dati dell’agenda
leggifile(riemp, pers2);
// stampa contenuto array pers2
stampaarraystruct(pers2, riemp);
// ordina contenuto array pers2 e lo salva sul file
ordinaAgenda(pers2, riemp); scrivifile(riemp, pers2);
printf("\n\n STAMPA AGENDA ORDINATA \n\n"); stampaarraystruct(pers2, riemp);
system("Pause"); }
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; } }
147 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 ...