• Non ci sono risultati.

File sequenziali in C - Lettura

Nel documento Array monodimensionali in C (pagine 64-74)

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

Nel documento Array monodimensionali in C (pagine 64-74)

Documenti correlati