Lettura da file:
fscanf(<nome_puntatore_file>, <formato_dati>, &<nomi_variabili>)
N.B. Analogamente a scanf(), la lettura termina quando si incontra uno spazio 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 ... ...
fclose (fileNomi);
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 ... ... if (!feof(FileNomi)) { ... ... fscanf(fileNomi,"%s",&nome); ... ... } fclose (fileNomi);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 147
#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"); //associa Fnomi al file
// fisico Nomi.txt e lo
// apre in scrittura
File sequenziali in C: un programma di esempio
// verifica che il file su memoria massa può essere // aperto in scrittura
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); // legge una stringa
// scrive sul file il nome digitato fprintf(Fnomi,"%s \n",nome);
conta++;
printf("Vuoi inserire altri nomi?(S/N)"); scanf("%c",&risp);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 149
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 151
un programma di esempio #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); //visualizza sul monitor il valore di nome
conta++;}
while (!feof(Fnomi)); }
fclose(Fnomi);
printf("\nLetti %d nomi dal file\n", conta); system("Pause"); } 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 tipobase
{char nome_str[20];}; //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 i nomi letti dal file
{fscanf(Fnomi,"%20s\n", &arr_nomi[conta].nome_str); conta++;}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 153
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);
} // chiude ramo else
system("Pause"); }
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
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 155
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;
// 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'; }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 157
// 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();
}
*riemp=i; }
// 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 159
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); } }
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);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 161
main ()
{const card=200; int i, riemp;
//persone: array di struct da salvare su file di testo
PERSONA persone[card];
//persone2: array di struct da caricare dal file di testo
PERSONA persone2[card];
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);
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 di testo i dati dell’agenda leggifile(riemp, persone2);
// stampa contenuto array persone2
stampaarraystruct(persone2, riemp);
// ordina contenuto array persone2 e lo salva sul file
ordinaAgenda(personr2, riemp); scrivifile(riemp, persone2);
printf("\n\n STAMPA AGENDA ORDINATA \n\n"); stampaarraystruct(persone2, riemp);
}
system("Pause"); }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 163
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; } }
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 ...