• Non ci sono risultati.

File sequenziali in C - Lettura

Nel documento Array monodimensionali in C (pagine 73-82)

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 ...

Nel documento Array monodimensionali in C (pagine 73-82)

Documenti correlati